喜欢探索javascript作为我对整个编程的第一次参考,但因为我不是专业人士无法理解很多东西。 因此,如果有人能够解释幕后实际发生的事情,我们将非常感激。
在body标签中,我声明了两个函数,一个是“new”,另一个是没有。
所以第一个函数是在不使用()的情况下调用的,所以我可以在文档加载时看到“hi”,因为我理解正确。但要看到“你好”我应该在代码中的某处使用像sayHello.call()这样的东西。
我想我理解“new”运算符作为创建对象实例的主要目的,甚至可以假设函数对象的声明实例与“new”运算符之间存在细微差别。
但实际发生了什么,以便文档在定义时使用'new'运算符执行函数,而另一个只是留在内存中的某个位置?
答案 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(){…})());
。