2013-02-18 3 views
1

Как исследовать javascript как мою первую ссылку на все программирование, но поскольку я не профессионал, не могу понять много чего. Так что было бы так высоко оценено, если кто-то может объяснить, что на самом деле происходит за сценой.«новый» оператор перед объявлением функции

В теге body я объявил две функции одной с «новой» и другой без.

  • новая функция SayHi() {Alert ('привет')}
  • функция SayHello() {Alert ('привет')}

Таким образом, первая функция вызывается без использования (), поэтому я вижу «привет», пока документ загружается, так как я его правильно понимаю. Но чтобы увидеть «привет», я должен использовать что-то вроде sayHello.call() где-то в коде.

Я предполагаю, что понимаю основную цель «нового» оператора как экземпляра объекта создания, более того, даже можно предположить, что существует небольшое различие между объявляющими экземплярами объекта функции с или без оператора «новый».

Но что на самом деле происходит, чтобы документ выполнял функцию с помощью «нового» оператора, пока это определение, а другое просто уходит где-то в памяти?

ответ

2

1) вы не используете new при определении функции, а используете new при вызове функции с намерением создать новый объект.

2) Если вы используете функцию new, это означает, что она сразу же срабатывает. Иногда это может быть полезно ... ... но это не так, как начинающий должен учиться. Кроме того, более-принятая версия этого метода называется IIFE (Сразу Вызывается функция Expression), который выглядит как

(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. Это просто сработало.

+0

На самом деле, использование [new' + function expression] (http://stackoverflow.com/q/10406552/1048572) никогда не под рукой. – Bergi

+0

Я согласен, но применяются типичные применения IIFE. И помимо нескольких побочных эффектов (каждый из которых обеспечивает разные побочные эффекты), они достигают той же функциональности, поэтому я упомянул, что на самом деле происходит IIFE, который обычно выполняется с помощью '(function() {/ * реализация * /}()); «Но я полностью понимаю, что вы говорите и соглашаетесь. – Norguard

+0

Сразу после года мне удалось оценить ваше время, потраченное на расширенный и полный ответ. Спасибо))) – vaseech

1

Это совершенно разные вещи. Второй один стандартный Java-функция декларации (и может быть вызвана с sayHi();), в то время как первый следует переписать в виде

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

Теперь вы можете увидеть это (named) function expression, которая непосредственно передается new operator , Это should not be used, если вы действительно хотели называть это немедленно (there are applications) использовать (function(){…})());.

+0

Вам не нужно окружать первый пример в круглых скобках. – MrWhite

+0

@ w3d: Нет, вам это не нужно, но я сделал, чтобы выделить, как он разбирается. – Bergi

Смежные вопросы