北京中科白癜风医院地址 http://www.bdfzkyy.com/window.open()方法是window对象的内置方法,它会加载指定的URL到新的或者已有的窗口,iframe或者标签页中。你可能会有一个疑问,我们为什么需要重写这个函数呢?设想一下你维护一个第三方的统计类库,类似于百度统计,当用户点击页面中的一个链接或者按钮时可能会打开一个新的窗口/标签页,在新页面加载之前我们需要统计用户这次的点击行为,然后保存起来。打开新窗口/标签页时会调用window.open()方法,所以我们需要重写它来支持添加我们的自定义统计逻辑。你可能会尝试这样做:open.js如果在浏览器中执行window.open()函数,会发现它引起了循环调用,如下图:循环调用导致超过了最大的调用堆栈数量限制,所以这种方式是不可行的。方案1现在我们尝试改写一下上面的代码,解除循环调用的问题:在上面的代码中,我们把原生的window.open方法保存在一个变量里,然后重写这个方法,在方法内部再调用指向原生方法的变量,这样就解决了这个问题。不过这个代码片段也有一个问题,它引入了一个新的变量nativeOpen,可能会造成命名冲突。方案2为了避免上面的问题,我们可以借助于闭包把变量封装在函数内部:把window.open作为参数传递到匿名函数内部,避免了变量污染。这里使用了一个立即执行的匿名函数封装了一个模块,在其内部返回一个封装好的匿名函数。总结上述是重写window.open()的两种方法,不过需要注意的是重写原生方法不是最佳实践,应该尽可能避免。
转载请注明:http://www.aierlanlan.com/rzfs/9619.html