在这里,我们将给大家分享关于javascript的eval()——编写可维护的javascript读书笔记的知识,让您更了解js的eval方法的本质,同时也会涉及到如何更有效地(1,eval)(''t
在这里,我们将给大家分享关于javascript 的 eval()——编写可维护的javascript读书笔记的知识,让您更了解js的eval方法的本质,同时也会涉及到如何更有效地(1,eval)(''this'') vs eval(''this'') in JavaScript?、asp.net – <%#Eval(“State”)%>或<%#DataBinder.Eval(Container.DataItem,“state”)%>、Chrome 开发者工具 Sources 面板里观察到的 JavaScript 文件名后缀中问号 eval 的含义、Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ''eval'' 是什么含义的内容。
本文目录一览:- javascript 的 eval()——编写可维护的javascript读书笔记(js的eval方法)
- (1,eval)(''this'') vs eval(''this'') in JavaScript?
- asp.net – <%#Eval(“State”)%>或<%#DataBinder.Eval(Container.DataItem,“state”)%>
- Chrome 开发者工具 Sources 面板里观察到的 JavaScript 文件名后缀中问号 eval 的含义
- Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ''eval'' 是什么含义
javascript 的 eval()——编写可维护的javascript读书笔记(js的eval方法)
再javascript中,eval()
的参数是一个字符串,eval()会将传入的字符串当做代码来执行,开发者可以通过这个函数来载入外部的javascript代码,活着随机生成Javascript代码并执行它,比如:
eval("alert(''Hi!'')");
var count = 10;
var number = eval("5 + count");
console.log(number);
在Javascript中eval()并不是唯一可以执行Javascript字符串的函数,使用Function构造函数亦可以做到这一点,setTimeout()和setInterval()也可以,来看一些例子:
var myfunc = new Function("alert(''Hi!'')");
setTimeout("document.body.style.background=''red''",50);
setInterval("document.title = ''It is now''" + (new Date()),1000);
在大多数Javascript社区中,人们都认为这些代码是最糟糕的实践。尽管在Javascript类库中eval()
,可能会经常用到(通常和JSON操作有关),另外三种用法即使也非常罕见。一个通用的原则是,禁止使用Function,并且只在别无他法时使用,eval()
。setTimeout和setInterval也是可以使用的,但不要用字符串形式而要用函数
(1,eval)(''this'') vs eval(''this'') in JavaScript?
http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript
第一个回答挺清晰
The difference between (1,eval) and plain old eval is that the former is a value and the latter is an lvalue. It would be more obvious if it were some other identifier:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
That is (1,eval) is an expression that yields eval (just as say, (true && eval) or (0 ? 0 : eval) would), but it''s not a reference to eval.
Well, the Ecma spec considers a reference to eval to be a "direct eval call", but an expression that merely yields eval to be an indirect one -- and indirect eval calls are guaranteed to execute in global scope.
var x = ''outer'';
(function() {
var x = ''inner'';
eval(''console.log("direct call: " + x)'');
(1,eval)(''console.log("indirect call: " + x)'');
})();
Not surprisingly (heh-heh), this prints out:
direct call: inner
indirect call: outer
第二个回答总结不错:
var global = (function () {
return this || (1, eval)(''this'');
}());
will correctly evaluate to the global object even in strict mode. In non-strict mode the value of this is the global object but in strict mode it is undefined. The expression (1, eval)(''this'') will always be the global object. The reason for this involves the rules around indirect verses direct eval. Direct calls to eval has the scope of the caller and the string this would evaluate to the value of this in the closure. Indirect evals evaluate in global scope as if they were executed inside a function in the global scope. Since that function is not itself a strict-mode function the global object is passed in as this and then the expression ''this'' evaluates to the global object. The expression (1, eval) is just a fancy way to force the eval to be indirect and return the global object.
A1: (1, eval)(''this'') is not the same as eval(''this'') because of the special rules around indirect verse direct calls to eval.
A2: The original works in strict mode, the modified versions do not.
asp.net – <%#Eval(“State”)%>或<%#DataBinder.Eval(Container.DataItem,“state”)%>
<%# Eval("State") %>
在你的aspx页面,与有
<%# DataBinder.Eval(Container.DataItem,"State") %>
在你的aspx页面?
解决方法
有关详细信息,请参阅the MSDN documentation。
Chrome 开发者工具 Sources 面板里观察到的 JavaScript 文件名后缀中问号 eval 的含义
例子:
这个后缀?eval代表了代码是通过eval函数动态执行的。在JavaScript中,eval函数可以接受一个字符串作为参数,并将这个字符串作为JavaScript代码来执行。这种在运行时动态执行代码的方式有时候会给调试带来一些困难,因为它不像常规的JavaScript文件那样直接从文件加载,而是在运行时通过eval函数执行字符串。
在开发过程中,为了方便调试和追踪问题,有时候会将JavaScript代码以字符串的形式传递给eval函数进行动态执行。当这种情况发生时,通常会在文件名的后缀上添加?eval来指示这是通过eval函数动态执行的代码。
例如,假设有一个名为app.dbg.js的JavaScript文件,如果这个文件是通过eval函数动态执行的,那么在Chrome开发者工具中可能会看到它的文件名显示为app.dbg.js?eval。
这种情况通常发生在一些动态生成JavaScript代码的情况下,比如某些模板引擎或者动态组件系统会在运行时生成JavaScript代码,并通过eval函数执行。另外,在一些特定的调试场景下,开发者也可能会手动使用eval函数执行一些临时代码来调试问题,这时候也会出现类似的文件名后缀。
eval
函数是 JavaScript 中的一个特殊函数,它用于将字符串作为 JavaScript 代码来执行。其语法为:eval(expression)
,其中 expression
是一个包含 JavaScript 代码的字符串。eval
函数在某些情况下可以被用来动态地执行代码,但同时也存在一些潜在的安全风险和性能问题,因此在实际应用中需要谨慎使用。
eval
函数的使用场景有很多,其中一些常见的情况包括:
- 动态代码执行:当需要动态地执行一段 JavaScript 代码时,可以使用
eval
函数。例如,根据用户输入的内容动态生成 JavaScript 代码并执行。 - 字符串转换为函数:有时候需要将字符串形式的函数体转换为可执行的函数,这时候可以使用
eval
函数。例如,在某些模板引擎中,可以将字符串形式的模板代码通过eval
转换为可执行的函数。 - JSON 解析:在某些情况下,如果需要动态地解析 JSON 字符串,可以使用
eval
函数。虽然更推荐使用JSON.parse
方法,但在某些情况下eval
也可以用来解析 JSON。 - 调试和测试:在调试和测试阶段,有时候可以使用
eval
函数来动态地执行一些代码片段,以便快速检查和验证代码逻辑。 - 动态加载脚本:在某些情况下,可能需要动态地加载和执行一些 JavaScript 脚本,这时候可以使用
eval
函数。但需要注意安全性问题,确保加载的脚本是可信的。
虽然 eval
函数在某些情况下具有一定的灵活性和便利性,但也存在一些潜在的问题和风险:
- 安全风险:由于
eval
函数可以执行任意字符串形式的 JavaScript 代码,因此存在被恶意注入攻击的风险。如果执行的代码不受信任或来自外部来源,可能会导致安全漏洞。 - 性能问题:由于
eval
函数的执行需要将字符串形式的代码进行解析和编译,因此可能会导致性能下降。特别是在循环中频繁使用eval
函数时,会对性能产生较大影响。 - 调试困难:由于
eval
函数执行的代码通常是动态生成的,因此在调试时可能会增加难度,特别是在代码复杂度较高或逻辑较为复杂的情况下。
虽然 eval
函数具有一定的使用场景和灵活性,但在实际开发中需要谨慎使用,特别是需要注意安全性和性能问题。在大多数情况下,可以通过其他方式来实现相同的功能,避免使用 eval
函数带来的潜在问题。
Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ''eval'' 是什么含义
Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ''?eval'' 是什么含义?
ChatGPT 的解答:
在Chrome开发者工具中,当你在Sources选项卡下使用关键字搜索时,可能会看到一些JavaScript文件名后面带有"?eval"。这通常表示这些JavaScript代码是在运行时动态生成的,而不是来自于一个独立的文件。具体来说,"?eval"是一种用于标识在Chrome DevTools中动态生成的JavaScript代码的约定,它表示这段代码是通过调用JavaScript的eval()函数或者类似的函数来执行的。
eval()函数是一种在运行时执行动态生成的JavaScript代码的方式,它接受一个字符串作为参数,该字符串包含要执行的JavaScript代码。由于eval()函数可以执行任意JavaScript代码,包括动态生成的代码,因此这种技术被广泛用于开发一些动态生成的应用程序。
在Chrome DevTools中搜索JavaScript代码时,如果发现某个JavaScript代码段的文件名带有"?eval"后缀,则意味着这段代码是动态生成的。在这种情况下,DevTools会将这些代码片段视为独立的文件,并在搜索结果列表中将其列出。由于这些代码片段没有独立的文件名,因此DevTools将它们的文件名设置为"?eval",以示区别。
看我在 Chrome 开发者工具里搜索 SAP UI5 的 bindingParser
实现,能看到 XXX-dbg.js
和 XXX-dbg?eval
总是成对出现:
这让我联想到了 Chrome 开发者工具 Console 面板的 VM:Virtual Machine
在Chrome开发者工具的Console面板中,VM指的是"Virtual Machine"(虚拟机)的缩写。当你在Console面板中输入一些JavaScript代码并运行时,Chrome会在一个称为"Execution Context"(执行上下文)的环境中执行该代码。这个执行上下文会创建一个虚拟机,也就是VM。
虚拟机是一个在内存中模拟计算机系统的程序,它可以运行代码并模拟硬件资源(如CPU、内存、硬盘等),同时提供一种安全隔离的方式来运行代码。在Chrome中,每个选项卡和框架都有一个独立的虚拟机实例,可以用于在该选项卡或框架中执行JavaScript代码。
当你在Console面板中运行JavaScript代码时,这些代码会在当前选项卡或框架的虚拟机中执行。如果你在多个选项卡或框架中打开了开发者工具并使用Console面板,你可能会看到多个VM实例,每个实例都对应一个选项卡或框架的虚拟机。这些VM实例会按照它们所属的选项卡或框架进行编号,例如"VM123"、"VM234"等等。
我们今天的关于javascript 的 eval()——编写可维护的javascript读书笔记和js的eval方法的分享已经告一段落,感谢您的关注,如果您想了解更多关于(1,eval)(''this'') vs eval(''this'') in JavaScript?、asp.net – <%#Eval(“State”)%>或<%#DataBinder.Eval(Container.DataItem,“state”)%>、Chrome 开发者工具 Sources 面板里观察到的 JavaScript 文件名后缀中问号 eval 的含义、Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ''eval'' 是什么含义的相关信息,请在本站查询。
本文标签: