我刚开始学习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
})();
答案 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
})();