【问题标题】:"new" operator before declaring function声明函数之前的“新”运算符
【发布时间】:2013-02-18 10:39:12
【问题描述】:

喜欢探索 javascript 作为我对整个编程的第一个参考,但由于我不是专业人士,所以无法理解很多东西。 因此,如果有人能解释幕后实际发生的事情,将不胜感激。

在 body 标记中,我声明了两个函数,一个带有“new”,另一个没有。

  • 新函数sayHi () {alert('hi')}
  • 函数 sayHello () {alert('hello')}

所以第一个函数在没有使用 () 的情况下被调用,所以我可以在文档加载时看到“hi”,因为我理解正确。但是要看到“你好”,我应该在代码中的某处使用类似 sayHello.call() 的东西。

我想我理解“new”运算符的主要目的是创建对象实例,此外甚至可以假设声明函数对象的实例有或没有“new”运算符之间存在细微差别。

但是实际上发生了什么,使得文档在定义时使用“new”运算符执行函数,而另一个只是留在内存中的某个地方?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    1) 在定义函数时不要使用new,而是在调用函数以创建新对象时使用new

    2) 如果在定义函数时使用new,则意味着它会立即触发。这有时会很方便…………但这确实不是初学者应该学习的方式。此外,这种技术更被接受的版本称为 IIFE(立即调用函数表达式),它看起来像

    (function () {
    /* function stuff in here */
    }());
    

    而不是

    new function () { /* function stuff in here */ }
    

    如果您尝试以这种方式定义函数,稍后尝试使用它会出错(因为未定义)。

    这里有两种实际定义函数的方法:

    var sayHi = function () { console.log("Hi!"); };
    

    function sayHello () { console.log("Hello"); }
    

    这些都不使用new

    为了给他们打电话,让他​​们做他们的工作,你不需要使用.call().call() 会起作用,但它有一个特殊用途,您在很长一段时间内都不需要。

    您需要做的就是:

    sayHello();
    sayHi();
    

    New 旨在用于制作某种对象时。

    在 JavaScript 中创建对象非常简单:

    var obj = {};
    var person = { name : "Bob" };
    
    person.name; // "Bob"
    person.age = 32;
    

    使用对象非常非常容易。

    但在其他编程语言中,您需要classes,它们就像对象的蓝图。

    在 JS 中,你可能会创建一个这样的类:

    function Person (name, age) { this.name = name; this.age = age; }
    

    然后像这样使用它:

    var bob = new Person("Bob", 32);
    bob.name; // "Bob";
    bob.age;  // 32;
    

    看到我把new放在哪里了吗?
    我用了一个造人的函数,我说我想让bob成为new Person

    但同样,在 JS 中,这可以很简单:

    var mike = { name : "Mike", age : 20 };
    

    不必构建函数,不必使用new。它刚刚工作。

    【讨论】:

    • 其实using new + function expression 从来都不是很方便。
    • 我同意,但典型的 IIFE 使用适用。除了一些副作用差异(每个都提供不同的副作用)之外,它们实现了相同的功能,这就是为什么我提到实际发生的是 IIFE,通常使用 (function () { /* implementation */ }()); 完成但我完全明白了什么你说并同意。
    • 一年之后,我设法感谢您花在扩展和完整答案上的时间。谢谢)))
    【解决方案2】:

    那是完全不同的东西。第二个是标准的javascript函数声明(可以用sayHi();调用),而第一个应该重写为

    new (function sayHi() { alert('hi'); });
    

    现在可以看到是(named) function expression,直接传递给new operator。这个should not be used,如果你真的想立即调用它(there are applications),请使用(function(){…})());

    【讨论】:

    • 您不需要将第一个示例括在括号中。
    • @w3d:不,你不需要,但我确实强调了它是如何解析的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多