匿名函数里的this的执行环境和指向

时间:2023-01-09 19:41:54

重新看了下闭包,在javascript高级程序设计第二版里的闭包里有如下例子,例子中介绍说匿名函数的执行环境具有全局性和this指向window,对于这句话很费解,所以就想个方法验证下。

var name = "The Window";
  
var object = {
    name :
"My Object",
    getNameFunc :
function(){
      
return function(){
        
return this.name;
      };
    }
  };
  alert(object.getNameFunc()());
输出 The Window

 

一.匿名函数的执行环境具有全局性,因此其this对象通常指向window,也可以称的上是window对象的方法的验证

var a = 100;     
(
function () {
console.log(a);
console.log(
this.a);
console.log(window.a);
})()
输出
100
100
100
(function  () {
this.a = 200;
})();


console.log(window.a);
console.log(
this.a);
console.log(a);

输出
200
200
200

上面两个例子验证了匿名函数的上下文环境是window

 

二.将闭包的题改一下来验证匿名函数的this

var object = {
    name :
"My Object",
    getNameFunc :
function(){
      
return function(){
if (this===window)
{
return "匿名函数的上下文环境是window";}
else
{
return "匿名函数的上下文环境不是window";};
       
      };
    }
  };
  alert(object.getNameFunc()());

//输出 匿名函数的上下文环境是window

 三.下面是从网上看的一篇文章上的代码

function foo() {

if (this===window) {
document.write(
"call a function");
}
else{
document.write(
"call a function or method");
}
}

function MyObject(name) {
// 下面的this指代new关键字新创建实例
this.name = name;
this.foo = function(){
document.write(
"call a method, by object: ", this.name, " ; and then ");
foo();
};
}

var obj1 = new MyObject("obj1");
var obj2 = new MyObject("obj2");

// 测试1: 作为函数调用
foo(); //Output=>call a function.

// 测试2: 作为对象方法的调用
obj1.foo(); //Output=>call a method, by object: obj1 ; and then call a function.
obj2.foo(); //Output=>call a method, by object: obj2 ; and then call a function.

// 测试3: 将函数作为“指定对象的”方法调用
foo.call(obj1); //Output=>call a function or method.
foo.apply(obj2); //Output=>call a function or method.

全局foo()函数也是方法,它其实是其上下文环境(window)的方法

参考:

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/