全局作用域 eval

eval是在caller的作用域里运行传给它的代码:

var x = ‘outer‘;

(function() {

var x = ‘inner‘;

eval(‘x‘); // "inner"

})();

在 ES5,可以分为direct调用或者indirect调用,和是否在strict模式调用

(1,eval)(‘1+1‘)  为indirect调用,(1,eval)仍然返回一个eval函数

同样下面这些也是非直接调用:

(eval, eval)(‘...‘)

(1 ? eval : 0)(‘...‘)

(__ = eval)(‘...‘)

var e = eval; e(‘...‘)

(function(e) { e(‘...‘) })(eval)

(function(e) { return e })(eval)(‘...‘)

(function() { arguments[0](‘...‘) })(eval)

this.eval(‘...‘)

this[‘eval‘](‘...‘)

[eval][0](‘...‘)

eval.call(this, ‘...‘)

eval(‘eval‘)(‘...‘)

只有在eval指向standard, built-in function(eval没有被覆盖或者不是复制品),才是direct调用:

eval = (function(eval) {

return function(expr) {

return eval(expr);

};

})(eval);

eval(‘1+1‘); // It looks like a direct call, but really is an indirect one.   It‘s because `eval` resolves to a custom function, rather than standard, built-in one

下面这些都是direct调用:

eval(‘...‘)

(eval)(‘...‘)

(((eval)))(‘...‘)

(function() { return eval(‘...‘) })()

eval(‘eval("...")‘)

(function(eval) { return eval(‘...‘); })(eval)

with({ eval: eval }) eval(‘...‘)

with(window) eval(‘...‘)

eval是引用指针的话,都为直接调用,如果为值的话,为间接调用

eval(‘1+1‘)这里的eval是引用,需要被执行,执行之后就是一个标准的,内置的 function对象

(1,eval)(‘1+1‘)的话,(1,eval)执行结果为一个值,不是一个引用

(eval)执行结果仍然为一个引用,不是值,因为小括号不会执行它里面的表达式(does not evaluate its expression),所以传一个引用进去,返回的仍然是引用

http://perfectionkills.com/global-eval-what-are-the-options/

时间: 2024-10-05 23:47:45

全局作用域 eval的相关文章

C++全局作用域与全局变量

在所有大括号之外的声明和定义就属于全局作用域. 在全局作用域中定义的变量是全局变量. 变量的声明使用extern 引用其他文件中定义的全局变量需要声明:extern T vari_name;之后再使用. 全局变量由于要被多个文件同时使用,所以必须只有一个定义,其余的全部为声明.否则就会重复定义. C++全局作用域与全局变量,布布扣,bubuko.com

哪个变量可以引用全局作用域中可用的全部变量

w http://php.net/manual/en/language.variables.superglobals.php http://php.net/manual/zh/language.variables.superglobals.php http://php.net/manual/zh/reserved.variables.globals.php http://php.net/manual/en/reserved.variables.globals.php Superglobals S

JS (全局作用域)

一.全局函数作用域(把变量的声明和函数的声明放在前面) 作用域(scope):一条数据可以在哪个范围中使用. 通常来说,一段程序代码中所用到的数据并不总是有效/可用的,而限定这个数据的可用性的代码范围就是这个名字的作用域.作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突. 变量(数据)js中,变量的作用域有两中,一种是全局作用域(全局变量) ,一种局部作用域(局部变量),一个变量是全局变量还是局部变量,主要看变量声明的位置.声明在函数内部,就是这个函数(function)的局部

怎样理解全局作用域和函数作用域

前言: 全局作用域下声明的变量再其他作用域下也可以使用, 但函数作用域下声明的变量, 无法在全局作用域下使用. var name1 = "Lilei"; function fn() { var name2 = "Hanmeimei"; console.log(name1); console.log(name2); } fn(); // "Lilei" // "Hanmeimei" console.log(name2); //

0140 JavaScript作用域:概述、全局作用域、函数作用域、块级作用域

1.1 作用域概述 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域.作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突. JavaScript(es6前)中的作用域有两种: 全局作用域 局部作用域(函数作用域) 1.2 全局作用域 作用于所有代码执行的环境(整个 script 标签内部),或者一个独立的 js 文件. 1.3 局部作用域 作用于函数内的代码环境,就是局部作用域. 因为跟函数有关系,所以也称为函数作

eval全局作用域和局部作用域的坑!

1.eval 是个函数,他可以被赋值给变量,例如   var evalg = eval;  evalg("alert(1)"); 2.eval被赋值时,也会把当前eval所处的变量作用域也赋值过去: var x = 1,evalg = eval; function a(){ var x = 3; eval("alert(x)");//3 evalg("alert(x)");//1 } //IE9之前的浏览器 没有全局eval的概念, 但是可以用

JS的全局函数eval解析JSON字符串函数

JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. 返回值 通过计算 string 得到的值(如果有的话). 说明 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回.因此请不要为 eval() 函数传递 String

js:全局作用域和调整浏览器窗口大小

调整浏览器窗口的大小:

js中三种作用域详解(全局,函数,块级)

1.全局变量:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量) 2.局部变量:声明在函数内部的变量(所有没有var直接赋值的变量都属于全局变量) JS中变量申明分显式申明和隐式申明. vari=100;//显式申明 i=100;//隐式申明 在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量. 当我们使用访问一个没有声明的变量时,JS会报错.而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申