84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
func.call(null, param) 与 func(param) 有区别吗?见到很多地方使用call的方式,不知道是为什么,直接调用不是更简单吗?
var func = function (param) { console.log(1); } func.call(null, 'hello world'); func('hello world');
希望答案会详细全面一点,把涉及的可能性都说一下。
ringa_lee
有!在严格模式下,第一种,this 是 null ,第二种是undefined。非严格模式下,都是window。
null
undefined
window
call 的作用是指定 this,而js里的this都是对象。所以使用call指定this,其实是第一个参数 toObject,所以可以写另一种 toObject.(当然,使用Object更好):
call
this
Object
function toObjet(v) { // assert v !== undefined && v !== null function fn() { return this;} return fn.call(v); }
对于第一个参数是undefined 或是 null 的情况下,在非严格模式下,函数中的this 会被解析为 window,否则,还是原来的 undefined或是null,详见我的博客:http://zonxin.github.io/post/2015/11/javascript-this
至于为什么一般写成 fn.call 更多的表示这是一个函数?但是这两种形式从阅读上似乎没有太大的区别,从浏览器的错误提示上也没有更大的区别。但是如果 fn 是某个对象的方法,就有区别了。如,obj.fn(args...) ,obj.fn(null,args...),前一种this是obj 后一种是null或是window,详见上面我的博客。
fn.call
fn
obj.fn(args...)
obj.fn(null,args...)
obj
在你的代码示例里,它们没有区别,为什么?
注意选中部分,因为你的func里压根没有用到this,所以这两种方式都仅仅完成一个函数执行,没什么区别。
func
但如果稍加调整,譬如:
var func = function (param) { console.log(this.name, param); } func.call({name: 'fucking'}, 'hello world');//fucking hello world func('hello world');//hello world
输出结果就截然不同了,这是因为call的第一个参数thisArg修改了func函数运行时的上下文this。而直接调用func('hello world')时,非严格模式下,this就是window对象,window上显然没有一个叫name的属性,所以仅输出了hello world。
thisArg
func('hello world')
name
hello world
搜一下js函数的四种调用方式吧
有!
在严格模式下,第一种,this 是
null
,第二种是undefined
。非严格模式下,都是
window
。call
的作用是指定this
,而js里的this
都是对象。所以使用call
指定this
,其实是第一个参数 toObject,所以可以写另一种 toObject.(当然,使用Object
更好):对于第一个参数是
undefined
或是null
的情况下,在非严格模式下,函数中的this 会被解析为 window,否则,还是原来的undefined
或是null
,详见我的博客:http://zonxin.github.io/post/2015/11/javascript-this
至于为什么一般写成
fn.call
更多的表示这是一个函数?但是这两种形式从阅读上似乎没有太大的区别,从浏览器的错误提示上也没有更大的区别。但是如果
fn
是某个对象的方法,就有区别了。如,obj.fn(args...)
,obj.fn(null,args...)
,前一种this
是obj
后一种是null
或是window
,详见上面我的博客。在你的代码示例里,它们没有区别,为什么?
但如果稍加调整,譬如:
搜一下js函数的四种调用方式吧