Javascript's函数构造函数-作用域问题
Javascript's Function constructor - scope issues?
这段代码new Function('fn', 'fn()')
创建了一个匿名函数,该函数执行了param和(在本例中,param是一个函数)。
执行console.log(new Function('fn', 'fn()'))
显示输出:
function anonymous(fn)
{
fn()
}
现在,文档声明:
注:
Functions
与Function constructor
创建do not create闭包到它们的创建上下文;类中创建的全球范围。当运行它们时,它们将只能访问它们自己的local variables and global ones
, 而不是来自作用域其中调用了Function构造函数。这和在函数表达式代码中使用eval
。
那么为什么这段代码产生1
而不是44
呢?
var a = 44;
function myFunc()
{
var a = 1;
function f()
{
alert(a)
}
new Function('fn', 'fn()')(f);
}
myFunc();
为什么?
上面这行呢?
只能访问自己的局部变量和全局变量而不是Function构造函数所在的作用域被称为
看起来f
是父a
的闭包,但为什么呢?它应该在全局运行,并且只能访问本地和全局!
我错过了什么?
因为您正在调用函数f
,这是一个创建闭包的普通函数。
文档中提到:
var a = 44;
function myFunc()
{
var a = 1;
new Function('fn', 'alert(a)')(); //shows 44, not 1
}
myFunc();
在您的示例中,您调用f函数,该函数在myFunc函数中定义。不管你是从哪里打的。所以你调用了在全局作用域中定义的匿名函数,见a = 44,匿名函数名为f函数,定义在myFunc作用域,见a = 1
我不确定你到底想用这段代码实现什么,但是如果你需要44在你的f中,你需要把它作为参数传递给它。
var a = 44;
function myFunc() {
var a = 1;
function f(myArgument) {
alert(myArgument)
}
new Function('fn', 'fn(a)')(f);
}
myFunc();
相关文章:
- Javascript中的内部函数作用域
- 将对象作为参数传递时的 Javascript 函数作用域
- Javascript 函数作用域概念
- 函数作用域 if 语句
- Javascript 函数作用域
- 评估和函数作用域
- 有没有办法迭代函数作用域内的公共方法
- Javascript 函数作用域差异
- 嵌套函数作用域变量
- JavaScript 对象中的变量和函数作用域
- Javascript 函数作用域和查找父对象的属性
- 脚本标记之间的 JavaScript 函数作用域
- 纯JavaScript onclick在分配函数作用域结束后变为未定义
- 具有闭包函数作用域的意外行为
- KnockoutJS:函数作用域错误
- 具有所选函数作用域的变量
- 使用 JSON 对 js 对象进行分级/解析时,返回的方法中的函数作用域会丢失
- Angular的watch - update变量在函数作用域之外
- 可以从函数原型中访问私有构造函数作用域的变量
- Javascript's函数构造函数-作用域问题