理解上下文与作用域
一直以来没有对上下文(context)的定义,总有些模糊,没有认真地总结过,听到这个词,会想到看过的“上下文是函数执行环境”,“上下文是this”,但真的让自己去解释还真说不上来,故趁今日有空总结温故一番,有什么错误的,还望大家提出!
《javascript权威指南》里是第8章函数导读页里有这样介绍到:
函数使用它们实参的值 来计算返回值,成为该函数调用表达式的值。除了实参之外,每次调用还会拥有另外一个值——本次调用的上下文——这就是this关键字的传值。
如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用上下文(context),也就是该函数的this的值 。用于初始化一个新创建的对象的函数称为构造函数。
写一段简单的代码理解这段话:
//定义一个对象
var context = { foo: "bar", func : function(){ console.log(this);//打印上下文 return this.foo; } };
//当通过这个对象来调用函数时,该对象就是此次调用上下文(context),也就是该函数的this的值 context.func();
控制台输出结果:
this代码了该函数的上下文(context),即对象context本身;
作用域:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。
因为没理解好这条规则,故前两天晚上看了篇文章的示例没能理解,一直想不通 T T
示例:( 一直在想为什么第二个bar输出的是1,不是2 )
function foo(){ var x = 1; return function() { alert(x); } }; var bar = foo(); bar(); // 1 var x = 2 ; bar(); // 1
好吧,作用域在函数定义时决定的,现在明白了,原谅我的无知......
接下来,来把头脑内混乱的 “上下文?作用域?上下文?作用域?” 再度区分下吧。
上下文(context)->this->挂载着变量与函数的对象(object-base)
作用域->函数定义时决定->作用于函数(function-base)
两者一个基于对象一个基于函数。