2011-11-02 39 views
7

好的内窗口对象,所以我想了解这个(没有双关语意),但显然不是。该关键字是一个构造函数

var Constructor = function() { 
    var internalFunction = function() { 
     return this === window; 
    }; 
    this.myMethod = function() { 
     alert(internalFunction()); 
    }; 
}; 
var myObj = new Constructor(); 
myObj.myMethod(); 

此提醒true。为什么内部函数看不到this作为对象?相反,我有myMethod使用alert(internalFunction.call(this));

编辑:我一直在寻找一个解释,为什么this以这种方式分配,而不是解决办法,如var self = this;等很抱歉,如果我没有说清楚。

+1

的答案,这个问题都没有使用'that'。我感觉被背叛了。 – hugomg

+0

@missingno:我不喜欢'那个'。这是非描述性的。在我回答说,我自己的选择没有更好:) –

+0

+1后来无意的双关语 – SMC

回答

6

this不绑定,直到被调用的函数,并取决于函数是如何被调用。您可以将其视为隐式传递给该函数的额外参数。

在这种情况下,问题是,你正在使用internalFunction()调用internalFunction。通过调用函数作为方法(如foo.bar()foo["bar"]())或通过call()apply()明确设置this来设置值this。您的电话既不这么做,this也会恢复为全局对象。

达到你想要在这种情况下什么,同时保持internalFunction私人最简单的方法是参考存储this的构造函数中:

var Constructor = function() { 
    var thisObj = this; 

    var internalFunction = function() { 
     return thisObj === window; 
    }; 

    thisObj.myMethod = function() { 
     alert(internalFunction()); 
    }; 
} 
+0

嗯,这是有道理的...'this'是在调用时分配的,所以通过调用'internalFunction()'我隐式地调用'window.internalFunction()'。很好解释。 –

+0

我会在任何一天对声明进行函数分配...... – jondavidjohn

+0

@jondavidjohn:我没有深入讨论这个问题,它对我原来的代码做了一个不必要的调整,所以我已经恢复了它。感谢您指出。 –

1

它是一个范围问题,你可以试试:由于功能范围规则

var Constructor = function() { 
    var $this = this; 
    var internalFunction = function() { 
     return $this === window; 
    }; 
    this.myMethod = function() { 
     alert(internalFunction()); 
    }; 
}; 
var myObj = new Constructor(); 
myObj.myMethod(); 
3

this每个函数内部重新分配...我想你的对象的副本存储为self,并相应地使用它..

var Constructor = function() { 

    var self = this; 

    var internalFunction = function() { 
     return self === window; 
    }; 
    this.myMethod = function() { 
     alert(internalFunction()); 
    }; 
}; 
var myObj = new Constructor(); 
myObj.myMethod(); 

应该给你预期的输出。

阿里纳斯

这是一个相当危险的做法,JavaScript的创造,主要是因为如果使用Constructor时忘记new关键字,你得到thiswindow(神)对象所以你会在没有警告的情况下将myMethod附加到窗口。

2

有五种方法调用JavaScript中的函数。的this值取决于您选择:

  1. 全局函数调用(例如myFunction())。没有明确的价值this给出。的this的值将是默认对象(window在浏览器中)。
  2. 方法调用(例如obj.myFunction())。的this值是在其上调用方法的对象(obj在这种情况下)。
  3. 使用call方法(例如myFunction.call(obj))。的this值被明确地提供(在这种情况下obj)。
  4. 使用apply方法(例如myFunction.apply(obj))。的this值被明确地提供(在这种情况下obj)。
  5. 构造函数(例如new MyFunction())。 this的值是由运行时提供的新创建的对象。

每五个在这里更详细地解释:

相关问题