谈JS中匿名函数的上下文环境
???? 受一位热心网友的关注和提问,我又对JS中的匿名函数的上下文环境作了详细地分析和实验,下面把我对该问题的一点思考与大家分享:
?
??? 关键字 this????
??? 在JavaScript的对象系统中,使用关键字 this 的地方:在对象的方法(或属性)被调用时,指代调用该方法(或属性)的对象实例。举个例子:
???
?
?
??? 测试3结果中明显不包含字符串“call a method, by object:”,说明该调用明显不是method,而是function。
??? 但再仔细想想,严格来说,全局foo()函数也是方法,它其实是其上下文环境(window)的方法,所以以下三种调用方式等价:
???// 署名函数function foo() {this.color = "red";}var f = new foo();alert(window.f.color);// Output=>redalert(this.f.color);// Output=>redalert(f.color);// Output=>redalert(window.color);// Output=>undefinedalert(this.color); // Output=>undefinedalert(color);// Output=>js error:color未定义// 六种调用最终结果对比,说明对象f的上下文环境不是window,而是window树结构的一个分支,应该说f属于window。// 匿名函数(function(){this.color="blue";})();alert(window.color);// Output=>blue(function(){alert(window.color);// Output=>blue 说明匿名函数的上下文环境是windowalert(this.color);// Output=>blue 在window中的变量被称为全局变量,可以省略thisalert(color);// Output=>blue 尽管可以省略this,但不建议用这样的方式,因为如果该匿名函数存在一个同名的局部变量,那么它调用的就不再是全局变量了})();// 通过对匿名函数属性的调用方式及结果对比,更坚定一个事实:匿名函数的上下文环境是window!?
?
??? 通过上面的详细举例,相信您一定明白了。以上如有错误,请多批评指正!
1 楼 ninedoors 2012-07-28 顶