пустая функция 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 библиотеку. Так одна строка кода наверху, что я не понимаю (это в выражении попытки/выгоды), предположите для копирования кода, который пользователь вводит, который хранится внутри cd.value в функцию. Но как это возможно?

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

5
задан Khoi 18 July 2010 в 02:55
поделиться

5 ответов

Понимаете ли вы, что делает 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

4
ответ дан 14 December 2019 в 01:00
поделиться

Конструктор класса функции

functionName = new Function («здесь должен быть написан код функции»);

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

Конструктор класса Function с параметрами

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

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

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

2
ответ дан 14 December 2019 в 01:00
поделиться

Аргументами функции являются именованные параметры функции, а затем тело функции. В этом случае у вас есть элемент с идентификатором 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);
}

Вы можете взглянуть на ] документацию Центра разработки Mozilla по Function , чтобы получить более полное объяснение того, как работает объект Function .

1
ответ дан 14 December 2019 в 01:00
поделиться

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

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

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

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

1
ответ дан 14 December 2019 в 01:00
поделиться

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

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

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

1
ответ дан 14 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: