javascript - 对省略'this'关键字的困惑

时间:2015-09-18 22:58:40

标签: javascript jquery

有人可以解释以下行为吗?前两个示例按预期工作,但为什么最后一个示例不起作用?我想了解当我省略'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();
    }
);

2 个答案:

答案 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。但一般情况下,它只是匿名函数的属性