2010-07-18 4 views
5

Так короткая версия, что я не понимаю, эта строка кода:пустая функция Javascript? Что это значит?

(new Function("paper", "window", "document", cd.value)).call(paper, paper); 

Длинная версия, посмотрите на эти функции:

window.onload = function() { 
      var paper = Raphael("canvas", 640, 480); 
      var btn = document.getElementById("run"); 
      var cd = document.getElementById("code"); 

      (btn.onclick = function() { 
       paper.clear(); 
       paper.rect(0, 0, 640, 480, 10).attr({fill: "#fff", stroke: "none"}); 
       try { 
        (new Function("paper", "window", "document", cd.value)).call(paper, paper); 
       } catch (e) { 
        alert(e.message || e); 
       } 
      })(); 
     }; 

Этот код от Raphael площадка, которая означает, что он реализует библиотеку raphael. Таким образом, единственная строка кода наверху, которую я не понимаю (она находится внутри выражения try/catch), предположим, чтобы скопировать код, который вводится пользователем, который хранится внутри cd.value в функцию. Но как это возможно?

Вы можете посетить страницу здесь: http://raphaeljs.com/playground.html

ответ

4

ли вам понимать какой new Function() делает? Он похож на eval() тем, что он берет строку javascript-кода - он использует эту строку для определения функции. Таким образом, линия вы вывесили бы эквивалентно делать:

(function(paper,window,document){ 
    /* the code in the cd.value string goes here */ 
}).call(paper,paper);

Подробнее: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Function

2

Функция конструктор класса

functionName = new Function("function code should be written here");

Эта конструкция оценивает код в виде строки, и гораздо медленнее, чем назначение анонимных функций. Его следует использовать только в тех местах, где это действительно необходимо. Конструктор класса

Функция с параметрами

functionName = new Function("varName","varName2","etc.","function code");

Похоже cd.value() предоставляет строку с яваскрипта кода, который собирается быть разобран и скомпилирован. Позже вы называете это ...

Вы должны проверить, как выглядит код в cd.value.

1

Это в основном создает новый объект функции с динамическим телом ... лучший способ я могу это объяснить, как это:

function (paper, window, document) where {} = cd.value; 

Вот ресурс, чтобы узнать больше: http://www.permadi.com/tutorial/jsFunc/index.html

1

Function функция создает новый экземпляр функции с последним параметром в качестве кода функции.

Так что в принципе делает то же самое, как:

eval("function(paper,window,document){"+cd.value+"}").call(paper, paper); 

Метод call просто вызывает функцию с элементами в paper массив для аргументов.

1

Аргументы Function являются именованными параметрами функции, а затем телом функции. В этом случае у вас есть элемент с идентификатором code, а атрибут value - это код Javascript.Учтите, что у вас есть этот HTML где-то в документе:

<textarea id="code"> 
    var a = "foo"; 
    var b = "bar"; 

    alert(a+b); 
</textarea> 

Теперь, ваш пример кода, если работать против этого code элемента, создаст следующую функцию:

function(paper, window, document) { 
    var a = "foo"; 
    var b = "bar"; 

    alert(a+b); 
} 

вы посмотрите на может the Mozilla Development Center's docs on Function, чтобы получить более полное объяснение того, как работает объект Function.

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