【问题标题】:Typeof of a javascript function is defined before the function is declared?在声明函数之前定义javascript函数的typeof?
【发布时间】:2012-06-22 15:05:19
【问题描述】:

有人可以解释或链接到一个资源,告诉我为什么:

<script type=" type="text/javascript">

    if(typeof window.myfunc == "function"){
        alert("Why does myfunc already exist ?");
    }

    function myfunc(){

    }
</script>

在 myfunc 函数尚未定义时会弹出警报吗?

我想我在 Chrome、Safari 和 IE(不是 FF)中发现了与此行为相关的问题。当包含函数的 js 文件在网页中多次包含时,它使我无法扩展函数的原型。在将其称为错误并报告它之前,我想了解更多相关信息。

谢谢!

【问题讨论】:

  • 当您将函数定义为var myfunc = function() {} 时,您会看到不同之处。

标签: javascript parsing function declaration typeof


【解决方案1】:

命名函数声明,包括函数体,被提升到 JavaScript 范围的顶部。我建议阅读this article about JavaScript scoping and hoisting

如果你做了这样的事情,你将函数分配给一个命名的 变量,只有变量声明会被提升,但它不会 直到分配实际发生的值:

if (typeof myFunc == 'function') {
    // will not be reached
}

var myFunc = function() { ... }

以上内容实际上被视为:

var myFunc; // myFunc is undefined

if (typeof myFunc == 'function') {
    // will not be reached
}

myFunc = function() { ... }

【讨论】:

  • 感谢悦的解释。我从来没有意识到函数
  • 感谢悦的解释。我从来没有意识到 func = function(){ } 语法实际上有所作为。这解决了我的情况!因为我运行了一个 web 服务,并且当我的 javascript 文件被包含两次时,我的函数也被提升了两次。问题是,使用函数创建的对象(如 obj = new myfunc())函数第二次被提升之前不受函数原型发生的更改的影响 功能被重新提升之后。很难解释,但希望你能明白我的意思。无论如何,感谢您对语法的提示!
【解决方案2】:

一个字:吊装

来自 JavaScript Garden 的引述:

“上述函数在程序开始执行之前被提升;因此,它在定义它的范围内的任何地方都可用,即使在源代码中的实际定义之前调用也是如此。”

更多信息在这里:http://bonsaiden.github.com/JavaScript-Garden/#function.general

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多