AngularJS插件开发:(func)()与(func).call(window)的区别
两种自执行函数写法的核心区别
嘿,这个问题抓得很准!在AngularJS插件开发里经常能碰到这两种写法,我来给你拆解清楚它们的差异:
1. 函数内部this的指向完全不同
这是最核心的区别:
- 对于普通自执行函数
(function() { 'use strict'; ... })():
在非严格模式下,this默认指向全局对象(浏览器环境就是window);但一旦开启了'use strict'严格模式,函数内部的this会变成undefined。 - 而
(function() { 'use strict'; ... }).call(window):
通过call()方法直接指定了函数执行时的this上下文为window——不管你有没有开启严格模式,函数内部的this都会稳稳指向全局的window对象。
看个直观的代码例子:
// 普通自执行函数,严格模式下this是undefined (function() { 'use strict'; console.log(this); // 输出: undefined })(); // 用call(window)的写法,严格模式下this仍然是window (function() { 'use strict'; console.log(this); // 输出: Window {...} }).call(window);
2. 传参的灵活性差异
call() 方法本身支持在指定 this 后直接传递参数给函数,写法上更灵活:
// 用call传参,同时绑定this (function(greeting, name) { console.log(`${greeting}, ${name}!`); // 输出: Hello, AngularJS! }).call(window, 'Hello', 'AngularJS');
虽然普通自执行函数也能传参((function(a,b){...})(1,2)),但在需要明确控制 this 的场景下,call() 的写法逻辑更清晰。
3. AngularJS插件场景下的实用意义
为什么很多AngularJS插件会用 .call(window) 这种写法?
因为插件通常需要访问全局的 window 对象,或者依赖一些默认绑定到全局上下文的代码。用 .call(window) 可以确保不管插件内部是否开启严格模式,this 都不会变成 undefined,避免出现意外的运行时bug,让插件在不同环境下的兼容性更强。
简单总结:两者的核心差异就是对函数内部this指向的控制能力,.call(window) 是一种更稳健的写法,尤其在需要兼容严格模式、确保全局上下文访问的插件开发场景中非常有用。
内容的提问来源于stack exchange,提问作者Alexandre Miziara
相关产品推荐
相关产品推荐

