理解Javascript的动态语言特性
Javascript是解释性语言,不是编译器,不能编译成二进制文件。
理解动态执行和闭包的概念
动态执行:javascript提供eval()函数来动态解释一段文本,并在当前上下文中执行它。
首先,我们需要了解eval()方法有一个全局闭包和一个当前函数的闭包,比如下面的代码。你认为会输出什么?
var i=100函数my func(){ var I=' test ';eval('i='hello。'');} my func();警报(一);//100首先我们来看一下定义一个变量i=100,然后调用myFunc函数,然后修改局部变量I使其从值‘test’变成‘hello’,但是我们知道eval的意思是立即执行一个文本;因此,上面的代码可以编写如下:
var i=100函数my func(){ var I=' test ';(function(){ return (i='hello '));})();} my func();警报(一);//100很明显,在执行myFunc()方法后,I的值从test变为hello,但由于是闭包,I的值是hello,所以不能对外使用,所以浏览器打印100个值;
我们都知道eval()是javascript的Global对象提供的方法,如果想访问Global对象的方法,可以通过浏览器中的host object-window提供;原则上,下面的代码也应该输出100;如下所示:
var i=100函数my func(){ var I=' test ';window.eval('i='hello。'');} my func();警报(一);然后不幸的是,在IE下,window.eval()和eval()方法都输出100;但是在标准浏览器下使用window.eval()时,输出是hello,eval()方法的输出是100;因为JScript引擎在IE下使用,而SpiderMonkey Javascript引擎在标准浏览器下使用,正是因为不同的Javascript引擎对eval()使用的闭包环境有不同的理解。
了解eval在哪里使用全局闭包
以下代码:
var i=100函数my func(){ var I=' test ';window.eval('i='hello。'');} my func();警报(一);标准浏览器下打印hello,但IE下打印100;如果使用以下代码:
var i=100函数my func(){ var I=' test ';//window.eval('i='hello。'');eval.call(window,' I=' hello ');} my func();警报(一);事实也是如此,这也为eval方法提供了访问全局闭包的能力。但是在IE下,Jscript的eval()没有这个能力,IE下一个是100;然而,另一种方法可以用来在IE下获得完美的结果。在window.execScript()方法中执行的代码将始终在全局闭包中执行,如下所示:
var i=100函数my func(){ var I=' test ';window.execScript('i='hello。'');//eval.call(window,' I=' hello ');} my func();警报(一);//Print hello script()引擎使用execScript()来分隔全局闭包和函数闭包中eval的不同表达式,而Mozilla javascript引擎使用eval()函数的不同调用形式来区分它们。两种方法不同,但全局封闭可以用不同的方式实现;
了解eval()使用当前函数的闭包
在正常情况下,eval()总是使用当前函数的闭包,如下所示:
var i=100函数my func(){ var I=' test ';eval('i='hello。'');} my func();警报(一);//100上面的代码:因为eval使用函数中的代码,所以输出是等于100的全局变量I;
Eval()始终被执行的代码文本视为一个代码块,代码块包含语句、复合语句或语句组。
我们可以使用以下代码来获取字符串;数字和布尔值。
eval(' true ');//trueeval('这是一个字符' ');//st
版权声明:理解Javascript的动态语言特性是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。