Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 分配给窗口属性的函数是否仍然可以访问局部变量?_Javascript_Flash_Window - Fatal编程技术网

Javascript 分配给窗口属性的函数是否仍然可以访问局部变量?

Javascript 分配给窗口属性的函数是否仍然可以访问局部变量?,javascript,flash,window,Javascript,Flash,Window,问题:在窗口上声明函数时,该函数是否仍然可以访问本地变量 (function(){ var foo = "poo"; //local var window.bar = function(){ alert(foo); } })(); bar(); 我在JSFIDLE中对此进行了测试,它可以工作,但是我的IDE建议它不应该工作。思想?最佳实践评论 作为参考,我之所以全局声明函数是因为Flash回退-Flash无法引用我的自动关闭函数您的函数未在窗口中定义

问题:在窗口上声明函数时,该函数是否仍然可以访问本地变量

(function(){
    var foo = "poo"; //local var
    window.bar = function(){
        alert(foo);
    }
})();

bar();
我在JSFIDLE中对此进行了测试,它可以工作,但是我的IDE建议它不应该工作。思想?最佳实践评论


作为参考,我之所以全局声明函数是因为Flash回退-Flash无法引用我的自动关闭函数

您的函数未在
窗口中定义。它在匿名包装函数中定义,然后分配给窗口中的属性

函数可以访问与它们定义在同一范围内的任何变量,它们被分配到哪个对象或分配多少次并不重要。一个函数可以分配给数百个不同的对象,但这不会改变它的工作方式,除非您将其分配给对象的原型,然后通过对象的实例调用它。但这只是因为调用它们的特殊方式,使得它们的上下文(this
对象)成为当前的对象调用方。其实这个

var a = new Array();
a.push(1);
相当于

var a = new Array();
Array.prototype.push.call(a, 1);

对不管函数最终被分配到哪里,都会形成一个闭包。从技术上讲,根据声明层次结构,本地人员可以访问窗口内容,但不能反过来,因为窗口在层次结构中处于较高的位置。就像在一家公司里,每个员工都认识ceo,但ceo并不了解/关心员工。在jsfiddle中,它可能会工作,因为jsfiddle有自己的“虚拟窗口”,您不会将它真正附加到浏览器上,因为它是jsfiddle内部的。@sabof,因为没有更好的答案。。可以这样写(从全局范围):
bar=(function(){var foo=“poo”;return function(){alert(foo);}}()以避免“鬼鬼祟祟”的副作用。@你的说法是错误的。正如sabof所说,匿名函数在
foo
var上创建一个闭包,因此可以访问和使用它的值,而不会在该函数中出现任何问题。IDE可能暗示它无法工作,可能是因为它的闭包检测实现很差或根本不存在。