function globalFunc1() {
console.log(hello);
}
function globalFunc2() {
var hello = 'hello';
globalFunc1(); // expected to print "hello" but `hello` is undefined instead
}
globalFunc2();
如果不将内部变量传递给globalFunc1()
,是否可以实现?
我目前正在使用以下hack来实现我想要的东西,但它太过于hackish和illlegant。
function globalFunc2() {
var hello = 'hello';
eval('(' + globalFunc1.toString() + ')()');
}
修改
我实际上是在寻找Javascript中与Function.prototype.bind
,.call
或.apply
类似的功能,以实现我想要做的事情。
详细说明我在做什么:
function checker() {
if (someVar == 'some value') {
/* ... */
}
}
setTimeout(function() {
var someVar = 'some value';
/* ... */
checker();
}, 1000);
答案 0 :(得分:2)
您可以在globalFunc1
内移动globalFunc2
,因此可以访问后者的内部变量,但可以将其分配给全局变量以允许从外部调用它:
function globalFunc2() {
window.globalFunc1 = function() {
console.log(hello);
};
var hello = 'hello';
globalFunc1(); // will print "hello"
}
globalFunc1(); // will print "hello"
这里,globalFunc1
在globalFunc2
内定义,因此在这种情况下可以访问其闭包中的变量hello
。但是,它本身就是一个全局变量,允许从外部访问它。
就您提出问题的方式而言,您可以从全局定义的函数中访问函数范围链。 if(且仅限于)全局定义(可能应该说"声明"相反)函数指向另一个函数范围内的函数 。
无论你做什么,都不要做eval
事。你实际上在做什么是通过词法复制它来定义(然后立即执行)该函数。而不是这样做,为什么不在那里开始编写函数,如上所述?