标签:函数名 catch 通过 覆盖 glob 破坏 try OLE 绑定
function doSomething(a) { b = a + doSomethingElse(a * 2); console.log(b * 3); } function doSomethingElse(a) { return a - 1; } var b; doSomething(2); // 15
变量b和函数doSomethingElse()是函数doSomething()的私有内容,外部作用域可以访问到是危险的,下面将私有内容隐藏在函数内部。
function doSomething(a) { var b; function doSomethingElse(a) { return a - 1; } b = a + doSomethingElse(a * 2); console.log(b * 3); }
var c = ‘hey‘; function bo() { var c = ‘hi‘; console.log(c); } bo(); // hi console.log( c ); // hey
上述代码的问题
函数bo()‘污染’了所在作用域,因为是一个具名函数
var c = ‘hey‘; (function bo() { var c = ‘hi‘; console.log(c); // hi })(); console.log(c); // hey
setTimeout( function() { console.log(‘等1秒!‘); }, 1000 ); // 行内函数表达式 setTimeout( function timeoutHandler() { console.log(‘等1秒!‘); }, 1000 );
var word = ‘hi‘; (function IIFE() { var word = ‘hey‘; console.log(word); // hey })(); console.log( word ); // hi
函数IIFE中第一个括号将函数定义为函数表达式,第二个括号使函数立即运行
下面是IIFE的另一种形式,将第二个括号写入第一个括号里var word = ‘hi‘; ( function IIFE() { var word = ‘hey‘; console.log(word); // hey }() ); console.log( word ); // hi
var say = ‘hi‘; (function IIFE(global){ var say = ‘hey‘; console.log(say); // hey console.log(global.say); // hi }(window)); console.log(say); // hi
undefined = true; (function IIFE( undefined ) { var a; if (a === undefined) { console.log(‘Undefined is safe here!‘); } })();
say = ‘hi‘; (function run1(func) { func(window); })( function run2(global) { var say = ‘hey‘; console.log(say); // hey console.log(global.say); // hi });
函数run2在函数run1执行之后当作参数传进去
var a = true; if (a) { var b = a * 2; console.log( b ); }
尽管变量b声明在块作用域内,但是var声明的变量不具有块作用域的特性,所以变量b被绑定在全局作用域内,污染了全局作用域,破坏了最小暴露原则。
标签:函数名 catch 通过 覆盖 glob 破坏 try OLE 绑定
原文地址:https://www.cnblogs.com/wydumn/p/11577865.html