我知道this
指向功能运行的当前对象。所以这里是根据定义的代码
function foo(){
alert(this); //output==window
}
所以,现在函数foo等于window.foo() 但现在在这里
function foo(){
function fo(){
alert(this);
}
fo();
}
所以,现在当foo
被执行时输出又是窗口对象为什么?因为嵌套的this
应该引用不同的object.since fo()现在不在窗口对象上操作为foo()== window.foo()。所以嵌套函数现在应该指向不同的对象
详情请见此处:
function foo()
{
alert(this);
function fo(){alert(this);}
as();
}
如果现在,var x = new foo();而foo()方法中的“this”指向对象对象但是嵌套这指向全局对象吗?现在你应该清楚我想说的了什么
答案 0 :(得分:5)
正如here所解释的那样,关键字this
在调用时动态绑定到'。'左侧的对象。
以上有三个例外。
.
时,关键字this
被绑定到全局对象窗口。this
绑定的内容。this
将引用新生成的实例。从此处开始,您仍然只是致电fo()
,this
绑定window
。
答案 1 :(得分:2)
两件事......
首先,您应该考虑使用控制台。 (console.log(this);
)。
第二,闭包和范围(this
)之间存在差异。
关闭:
function a() {
function b() {
// b is only available inside `a`
}
}
// so out here b will be undefined
范围:
function a() {
// in here the scope can be multiply things depending on how the function is called. See below
console.log(this);
}
范围是默认的window
,如果函数是范围引用对象的对象的方法。
a(); // logs: window
var o = {
a: a
};
o.a(); // logs: { a: a }
您可以使用以太网调用或应用
覆盖此拒绝行为var s = [1, 2, 3]
a.call(s); // logs: [1, 2, 3]
// or using apply
a.apply(s) // logs: [1, 2, 3]
答案 2 :(得分:1)
this
值取决于函数的调用方式,而不是定义的方式。如果您具有以下功能:
var test = function() {
console.log(this);
};
然后有很多方法可以称之为:
test()
- 它将是window
new test()
- 它将是实例({ foo: test }).foo()
- 它将是对象test.call(bar)
- 它将是bar
函数是否嵌套并不重要。
答案 3 :(得分:0)
编程,你做错了。
要使fo成为对象的功能,你应该这样做:
function foo(){
this.fo = function(){
alert(this);
}
}
f = new foo();
f.fo();
看看如何在对象声明中启动fo函数?
现在当你f.fo()
[object Object]
时,你会得到{{1}}