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

标签 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
})();

最佳答案

这里有两个名为shoutIt的变量:一个是varshoutIt定义的全局变量,另一个是中形参定义的变量函数(shoutIt){...

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

相比之下,shoutIt 在这里指的是具有该名称的函数参数,而不是全局变量,后者是上一级作用域。 (全局变量被同名的更直接的变量“遮蔽”。)该函数不使用任何参数调用,因此函数内 shoutIt 的值为 undefined.

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

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

关于javascript - 为什么在访问匿名自执行函数的参数时需要使用 "this"关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42564378/

相关文章:

javascript - jqgrid 服务器端错误消息/验证处理

javascript - PHP页面刷新问题

javascript - JavaScript 匿名函数的参数

julia - 在 Julia 中,当涉及外部作用域时,匿名函数的类型是什么?

Javascript 闭包内存使用与对象成员

javascript - 问 : mouseleave not triggered when expected in A-frame

c# - 匿名函数的 FunctionPointer 唯一性

scala - Scala 匿名函数中这两个表达式有什么区别?

javascript - 你如何在 JavaScript 中解释这种结构?

javascript - 在编辑 javascript 时使用 emacs 进行重构