Eval and new funciton not the same thing_javascript技巧
1、函数声明式
function foo(){
//code
}
在JS中,函数也是对象,函数对象连接到Function.prototype( Function.prototype连接到Object.prototype)
2、函数字面量式
var foo = function foo(){
//code
}
对象拥有一个连到原型对象的隐藏连接。对象字面量间生的对象连接到Object.prototype。 foo.__proto__ == Function.prototype
3、使用New的构造函数生成
new Function ([arg1[, arg2[, ... argN]],] functionBody);
每次执行都生成新的函数
网上的资料有很多介绍这三种模式的,前2种几乎是相同的,基于相同的词法作用域。
词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。 with和eval除外,所以只能说JS的作用域机制非常接近词法作用域(Lexical scope)。
突然感觉有点离题了,这篇文章其实是记录eval和New Function的区别,下面回归正题:
以前有人会说,new Function的方式是几乎与eval相等,今天我查了一下,确实是不同的东西,说这句话的人太不负责了。关于eval和new function,得到的结果都是一致的,都会叫你不要去使用它们。所以结论就是“不得不”才使用。
eval() evaluates a string as a JavaScript expression within the current execution scope and can access local variables.
new Function()parses the JavaScript code stored in a string into a function object, which can then be called. It cannot access local variables because the code runs in a separate scope.
从以上2点看出,eval的作用域是现行的作用域,而new Function是动态生成的,它的作用域始终都是window。并且,eval可以读到本地的变量,new Function则不能。
function test() {
var a = 11;
eval('(a = 22)'); //如果是new Function('return (a = 22);')(); a的值是不会覆盖的。
alert(a); // alerts 22
}
所以一般eval只用于转换JSON对象,new Function也有特殊的用途,只是在不清楚的情况下还是少用为妙。
更多资料:邪恶的eval和new Function
这里作个备份:
代码:
// 友善提醒:为了你的手指安全,请在Chrome下运行
'alert("hello")'.replace(/.+/, eval);
'alert("hello")'.replace(/.+/, function(m){new Function(m)();});
var i = 0; eval(new Array(101).join('alert(++i);'));
var i = 0; new Function(new Array(101).join('alert(++i);'))();

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

eval signifie « évaluation » et est une fonction intégrée à Python qui est utilisée pour exécuter une expression de chaîne et renvoyer le résultat du calcul de l'expression ; c'est-à-dire que lors de l'attribution d'une variable, la représentation à droite du signe égal est ; écrite sous le format d'une chaîne, La valeur de retour est le résultat de cette expression. Syntaxe "eval(expression[, globals[, locaux]])".

Comment désactiver eval en PHP sous win : 1. Téléchargez « PHP_diseval_extension » ; 2. Recherchez le PHP actuellement utilisé par le serveur ; 3. Ouvrez le fichier de configuration PHP ; 4. Ajoutez le code « extension=diseval.so » ; Redémarrez le service.

En Python, la fonction eval() est utilisée pour exécuter une expression de chaîne et renvoyer son résultat. Il prend une chaîne contenant une expression comme paramètre et évalue l'expression. La fonction eval() est puissante, mais il convient de noter qu'elle exécutera toute expression Python valide contenue dans la chaîne, vous devez donc éviter d'accepter des chaînes d'entrée externes lorsque vous l'utilisez pour éviter les failles de sécurité.

eval est une fonction intégrée à Python qui est utilisée pour analyser et exécuter des chaînes sous forme de codes et renvoyer les résultats de l'exécution. Étant donné que la fonction « eval » peut exécuter du code Python arbitraire, vous devez examiner attentivement les problèmes de sécurité lorsque vous utilisez la fonction « eval ». Si vous transmettez une chaîne non fiable à la fonction « eval », cela peut entraîner des problèmes de sécurité tels que l'injection de code. .

eval() de Python Nous pouvons utiliser le Pythoneval()[1] intégré pour évaluer dynamiquement des expressions à partir d'une entrée basée sur une chaîne ou basée sur un code compilé. Si nous transmettons une chaîne à eval(), alors la fonction l'analyse, la compile en bytecode[2] et l'évalue comme une expression Python. Mais si nous appelons eval() avec un objet code compilé, alors la fonction effectue uniquement l'étape de calcul, ce qui est très pratique si nous appelons eval() plusieurs fois avec la même entrée. eval() de Python est défini comme suit. eval(expression[,globals[,locals]]) cette fonction

1. Concept Dans le langage Java, l'expression "nouvelle" est responsable de la création d'une instance, dans laquelle le constructeur est appelé pour initialiser l'instance ; le type de valeur de retour du constructeur lui-même est vide, et non "le constructeur renvoie la nouvelle expression créée". Référence d'objet", mais la valeur de la nouvelle expression est une référence à l'objet nouvellement créé. 2. Objectif : créer un objet d'une nouvelle classe. 3. Mécanisme de travail : allouer de l'espace mémoire aux membres de l'objet et spécifier les valeurs par défaut. Initialiser explicitement les variables des membres, effectuer des calculs de méthode de construction et renvoyer souvent des valeurs de référence. signifie en ouvrir de nouveaux en mémoire. L'espace mémoire est alloué dans la zone de tas de la mémoire. Il est contrôlé par jvm et gère automatiquement la mémoire. Ici, nous utilisons la classe String comme exemple. Pu

Différences : 1. Make ne peut être utilisé que pour allouer et initialiser des données de types slice, map et chan, tandis que new peut allouer n'importe quel type de données. 2. La nouvelle allocation renvoie un pointeur, qui est le type "*Type" tandis que make renvoie une référence, qui est le Type. 3. L'espace alloué par new sera effacé ; une fois que make aura alloué l'espace, il sera initialisé.

