下面的实例,只是基于是用this
在闭包中使用this对象可能会导致一些问题,因为 this对象是在运行时基于函数的执行环境进行绑定的:全局函数中,this等于window,当函数被特定于某个对象进行调用时,this代表调用的对象。但是匿名函数的执行环境具有全局性,所以匿名函数中this通常指定为window。
例如:
var name="The Window"; var object = { name: "My Object", getNameFunc: function () { return function () { return this.name; }; } }; alert(object.getNameFunc()()); //执行结果The Window
上面的代码中,使用this对象进行返回,返回的是全局变量name的值,因为函数在被调用时,都会取得两个特殊变量,this和arguments,内部函数在用this进行搜索时,只会搜索到其活动对象为止,因此使用this永远不可能搜索到外部函数的变量。
不使用this不会出现这种情况
再例如:
var name = 1; function parentFunc() { var name = 6; return function () { this.name++; return this.name; } } var fun = parentFunc(); alert(fun());// name前面用this 返回的值是2,不加this,返回的是7 alert(fun());// name前面用this 返回的值是3,不加this,返回的是8 alert(fun());// name前面用this 返回的值是4,不加this,返回的是9 因为产生了闭包,所有不加this的name可以看做为内部的静态变量
上面的代码体现了用this和不用this 的区别,用this只是指定当前的return函数的作用域加上全局作用域。而不使用,则可以直接访问外部作用域。
如果解决这种问题,可以在返回函数的上方将外部作用域指定给一个变量,如:
var name="The Window"; var object = { name: "My Object", getNameFunc: function () { var that = this; return function () { return that.name; }; } }; alert(object.getNameFunc()()); //My Object