Так короткая версия, что я не понимаю, эта строка кода:
(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
Понимаете ли вы, что делает 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
Конструктор класса функции
functionName = new Function («здесь должен быть написан код функции»);
Эта конструкция оценивает код как строку и работает намного медленнее, чем присваивание анонимные функции. Его следует использовать только там, где это действительно необходимо.
Конструктор класса Function с параметрами
functionName = new Function ("varName", "varName2", "etc.", "Function code");
Он выглядит как cd.value ()
предоставляет строку с кодом javascript, который будет проанализирован и скомпилирован. Позже вы назовете это ...
Вы должны проверить, как выглядит код в cd.value
.
Аргументами функции
являются именованные параметры функции, а затем тело функции. В этом случае у вас есть элемент с идентификатором 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
.
Функция Функция
создает новый экземпляр функции с последним параметром в качестве кода функции.
Таким образом, он в основном делает то же самое, что и:
eval("function(paper,window,document){"+cd.value+"}").call(paper, paper);
Метод call
просто вызывает функцию с элементами в массиве paper
для аргументов.
По сути, он создает новый объект функции с динамическим телом ... лучше всего я могу объяснить это так:
function (paper, window, document) where {} = cd.value;
Вот ресурс, чтобы узнать больше: http: //www.permadi.com/tutorial/jsFunc/index.html