在访问匿名自执行函数的参数时,为什么需要使用“this”关键字?

时间:2017-03-02 19:34:48

标签: javascript anonymous-function

我刚开始学习Javascript而且我一直在玩匿名的自动执行功能。我制作了一些代码不能按照我的预期运作。为什么在这个实例中需要“this”关键字来获取变量“shoutIt”的值?

第一个警告显示“它是否有效?(1)未定义”,而第二个警告显示“它是否有效?(2)[是!]”。

谢谢!

var shoutIt = "[YES!]";

//creating an anonymous, self-executing function
(
    function (shoutIt) {
        shoutItDebug = shoutIt;
        shoutItDebug = this.shoutIt;
        alert("Did it work? (1) " + shoutIt); //doesn't work, undefined
        alert("Did it work? (2) " + this.shoutIt) //works
})();

3 个答案:

答案 0 :(得分:2)

这里有两个名为shoutIt的变量:一个是var shoutIt定义的全局变量,另一个是function (shoutIt) { ...

中的形式参数定义的变量

当您在非严格模式下运行非方法函数(即,foo()而不是bar.foo())时,this等于全局对象(在浏览器,window)。在函数内部,this.shoutIt引用全局范围中的shoutIt变量。

相比之下,shoutIt在这里指的是带有该名称的函数参数,而不是全局变量,它是一个范围级别。 (全局变量被同名的更直接变量“遮蔽”。)函数不会被任何参数调用,因此函数中shoutIt的值为undefined

如果要传入一个值作为名为shoutIt的参数,请在调用括号中提供一个:

(function (shoutIt) {
    ...
})(someValue);

答案 1 :(得分:1)

因为您的匿名函数期望shoutIt作为参数,但您没有传递任何内容。

基本上你的函数需要一个参数shoutIt。此参数将在函数的本地范围内。如果没有传递任何内容,并且编译器将获取shoutIt的值,它将立即从本地范围访问它并且不会进入全局级别。在本地级别,因为您没有向函数传递任何内容,它会为您提供undefined

有两种解决方案

1)传递shoutIt的值

var shoutIt = "[YES!]";

//creating an anonymous, self-executing function
(
    function (shoutIt) { //expecting that value
        shoutItDebug = shoutIt;
        shoutItDebug = this.shoutIt;
        alert("Did it work? (1) " + shoutIt);
        alert("Did it work? (2) " + this.shoutIt)
})(shoutIt);**strong text** //passing argument to the function

OR

2)不要传递任何参数

var shoutIt = "[YES!]";

//creating an anonymous, self-executing function
(
    function () {
        shoutItDebug = shoutIt;
        shoutItDebug = this.shoutIt;
        alert("Did it work? (1) " + shoutIt); 
        alert("Did it work? (2) " + this.shoutIt) 
})();

'这个'作品

基本上'这个'指的是javascript中的上下文。 默认情况下,它指向窗口对象。尝试做

console.log(this) //outputs the window object

无论在全局级别定义什么,都会自动链接到窗口对象。

答案 2 :(得分:0)

您的参数名称与函数外部的变量相同,并且您没有将变量传递给函数。

通过您的示例,您可以执行一些不同的操作,以使其按预期工作。

一个。将shoutIt传递给函数

var shoutIt = "[YES!]";
//creating an anonymous, self-executing function
(
    function (shoutIt) {
        shoutItDebug = shoutIt;
        shoutItDebug = this.shoutIt;
        alert("Did it work? (1) " + shoutIt); //doesn't work, undefined
        alert("Did it work? (2) " + this.shoutIt) //works
})(shoutIt);

B中。更改函数定义中参数的名称。

var shoutIt = "[YES!]";

//creating an anonymous, self-executing function
(
    function (shoutItAgain) {
        shoutItDebug = shoutIt;
        shoutItDebug = this.shoutIt;
        alert("Did it work? (1) " + shoutIt); //doesn't work, undefined
        alert("Did it work? (2) " + this.shoutIt) //works
})();