全局做用域 eval

eval是在caller的做用域裏運行傳給它的代碼:express

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),因此傳一個引用進去,返回的仍然是引用
 
 
相關文章
相關標籤/搜索