【问题标题】:Scope Issues With Setting Javascript Function设置 Javascript 函数的范围问题
【发布时间】:2012-07-11 04:03:51
【问题描述】:

我需要“更新”另一个 javascript 文件中存在的函数。该文件如下所示:

function jf(){
    alert('1');
}

//call jf periodically
 jf();   

加载后的第二个js文件如下:

console.log(jf);
console.log(window.jf);
var func=function(){
  alert('2');  
};
jf=func;
window.jf=func;

第一个日志成功返回原始jf方法,第二个没有。第一组好像设置了局部变量jf,第二组基本什么都不做。有没有办法实现这个功能?

【问题讨论】:

  • 第二次获得了什么?
  • 你的console.log(window.jf)window.jf=func调用之前执行,所以它不可能输出jf方法。
  • 秒未定义。原始的function jf() 在任何一个console.log 之前很久就执行了。窗口日志检查该函数是否存在于窗口范围内。
  • 那么第二个jf = func; 应该“更新”jf。更新后拨打jf();会怎样?

标签: javascript function scope


【解决方案1】:

根据Javascript closures - behavior of overridden functions from the global scope

var done =function done 基本上做同样的事情。它们将在内部范围内隐藏外部定义,但不会在外部范围内替换它。

这意味着,如果您处于相同的执行上下文中,您只能覆盖您对 function jf() 的初始定义。否则,将function jf(){ ... 替换为window.jf = function(){...

此外,在检查器控制台中运行测试可能会有所帮助。

【讨论】:

  • 是的……这就是我要找的。而且为了记录,有没有办法模拟这种情况?一个完全独立的 js 文件的上下文。
  • 不幸的是,这就是作用域和上下文的重点,将程序的一部分与另一部分隔离开来。
  • 嘘。我想知道是否可以替换脚本标签....非常感谢 grigore,非常有用。
  • @GRIGORE-TURBODISEL——我想你很困惑。每个脚本元素没有新的范围,函数和窗口都有。 OP 的代码都在一个全局上下文中运行。问题是执行顺序之一——将新函数表达式分配给(全局)jf 发生在调用 jf 之后,因此显然尚未分配新函数,因此它没有被调用。顺便提一下,jfwindow.jf 指的是全局对象的完全相同的属性。
  • @RobG OP 描述的症状表明 jf() 没有在全球范围内定义。如果是这样,症状会有所不同,并且我提供的参考资料中都涵盖了所有内容。您还应该看到stackoverflow.com/questions/9941736/…
【解决方案2】:

首先,使用变量:

var jf = function () {
    alert('1');
};

jf();

那么第二位应该可以正常工作:

var func = function () {
    alert('2');
};

jf = func;
jf();

【讨论】:

  • 在一个完美的世界里,是的。不幸的是,这不是一个选择。我不是在寻求最佳实践,只是想知道这种情况是否可行。
  • @Dested — func 的新值在您尝试调用它之前不会被分配。它与范围无关,与执行顺序有关。它都在一个全局范围内运行。
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2020-04-18
  • 2013-05-18
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多