有人可以解释以下行为吗?前两个示例按预期工作,但为什么最后一个示例不起作用?我想了解当我省略'this'关键字时发生了什么。看起来我能够在前两个例子中省略它。
提醒您好:
$(document).ready(
function()
{
hello = 'hello';
function sayHello()
{
alert( this.hello );
}
sayHello();
}
);
提醒您好:
$(document).ready(
function()
{
hello = 'hello';
function sayHello()
{
alert( hello );
}
sayHello();
}
);
警告声明错误: Uncaught ReferenceError: hello is not defined
$(document).ready(
function()
{
this.hello = 'hello';
function sayHello()
{
alert( hello );
}
sayHello();
}
);
答案 0 :(得分:6)
全局变量自动成为window
对象的属性。当您在未指定任何上下文的情况下调用函数(即functionName()
而不是something.functionName()
)时,默认上下文也是window
对象。
您的第一个功能是设置全局变量hello
,它与window.hello
相同。 sayHello()
功能会提醒this.hello
,这与window.hello
相同,因为this == window
。
第三种情况不同,因为$(document).ready()
正在调用您的外部函数。当jQuery调用事件处理函数时,上下文是事件的目标。在这种情况下,this == document
,所以当你这样做时:
this.hello = 'hello';
它相当于:
document.hello = 'hello';
这不会设置全局变量hello
,因此sayHello
不会访问它。这将等效地工作:
$(document).ready(
function()
{
this.hello = 'hello';
function sayHello()
{
alert( document.hello );
}
sayHello();
}
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 1 :(得分:0)
在第一个示例中,当您说hello='hello'
时,您要为变量hello
分配值。
所以,如果你alert(hello)
它打印变量。
当您说this.hello='hello'
时,它会为该函数指定一个属性。由于该函数是$(document)
的回调,因此它正在分配document.hello
。但一般情况下,它只是匿名函数的属性