84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
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函数的四种调用方式吧