声明函数之前的“new”运算符

时间:2013-02-18 10:39:13

标签: javascript

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

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

  • 新功能sayHi(){alert('hi')}
  • function sayHello(){alert('hello')}

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

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

但实际发生了什么,以便文档在定义时使用'new'运算符执行函数,而另一个只是留在内存中的某个位置?

2 个答案:

答案 0 :(得分:2)

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();

当您想要制作某种对象时,可以使用“新建”。

在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。它刚刚起作用。

答案 1 :(得分:1)

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

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

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