宝哥软件园

理解Javascript的动态语言特性

编辑:宝哥软件园 来源:互联网 时间:2021-09-09

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

更多资讯
游戏推荐
更多+