Skip to main content

例子

a(1);  //alert( n )
function a( n ){alert( n );}


a(1); //TypeError a is not a function
var a = function ( n ){alert( n );}

解释:

两种写法及它们的区别本质在于js引擎在解析时,会先预读function a()这种,而不会预读var a = function这种。

看另一个小应用

一般黑客做xss测试的时候会alert, :),那么我们监控一下alert函数

错误:

var _alert = alert;function alert( p ) {
_alert( p );
console.log( location.href)}alert( 123 );// 循环引用,出错

正确

var _alert = alert;var alert = function( p ){
_alert( p );
console.log( location.href)};alert( 123)

错误的写法错的原因在于,引擎在解析js时,已经用自定义的alert把宿主对象window的原有alert给重写了,_alert指向的是自定义的alert函数,而非宿主对象window的原有alert,这样就导致了循环引用,自己圈圈自己了