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可能暗示它无法工作,可能是因为它的闭包检测实现很差或根本不存在。