1.當(dāng)調(diào)用函數(shù)時(shí),除了傳入在定義中顯式聲明的參數(shù)之外权纤,同時(shí)還傳入兩個(gè)隱式參數(shù)钓简,arguments 和 this。
①arguments參數(shù)是傳入函數(shù)的所有參數(shù)的集合汹想,具有l(wèi)ength 屬性外邓,表示傳入?yún)?shù)的個(gè)數(shù),通過arguments參數(shù)還可以獲取那些與函數(shù)形參不匹配的參數(shù)古掏。在非嚴(yán)格模式下损话,arguments 對(duì)象是函數(shù)參數(shù)的別名,修改arguments對(duì)象會(huì)修改函數(shù)實(shí)參槽唾,可以通過嚴(yán)格模式避免修改函數(shù)實(shí)參丧枪。
②this 表示函數(shù)上下文,即與函數(shù)調(diào)用相關(guān)聯(lián)的對(duì)象庞萍,函數(shù)的定義方式和調(diào)用方式?jīng)Q定this的取值
function example(parm1,parm1){
????????console.log('this',this);
????????console.log('arguments',arguments);
}
example(1,2)
2.函數(shù)的調(diào)用方式有4種:
①作為函數(shù)調(diào)用:example()
②作為方法調(diào)用:example.method()
③作為構(gòu)造函數(shù)調(diào)用:new Example()
④通過apply('',[]) 與call('','','')
/ 1 函數(shù)模式調(diào)用 就是一個(gè)簡(jiǎn)單的函數(shù)調(diào)用. 函數(shù)名的前面沒有任何引導(dǎo)內(nèi)容.
function func() {
? ? console.log('函數(shù)模式');
}
func()
// 2 作為方法調(diào)用 方法一定是依附于一個(gè)對(duì)象, 將函數(shù)賦值給對(duì)象的一個(gè)屬性, 那么就成為了方法
function myFunc0() {
? ? console.log('方法調(diào)用');
}
var methods={
myMethod:myFunc0
}
methods.myMethod()
// 3 構(gòu)造函數(shù)調(diào)用
function myFunc1(){
console.log('構(gòu)造函數(shù)')
}
var my = new myFunc1()
// 4 call apply
function myFunc2(){
console.log('call apply')
}
var test={};
myFunc2.apply(test,[]);
myFunc2.call(test,'');
3.函數(shù)的調(diào)用方式影響this的取值
①如果作為函數(shù)調(diào)用豪诲,在非嚴(yán)格模式下,this指向全局window對(duì)象挂绰;在嚴(yán)格模式下this指向 undefined
②作為方法調(diào)用,this通常指向調(diào)用的對(duì)象
③作為構(gòu)造函數(shù)調(diào)用服赎,this通常指向新創(chuàng)建的對(duì)象
④通過call apply 調(diào)用葵蒂,this指向call apply 的第一個(gè)參數(shù)
// 1 非嚴(yán)格模式 函數(shù)模式調(diào)用
function func() {
? ? console.log('非嚴(yán)格模式-函數(shù)模式-this', this);
}
func()
// 嚴(yán)格模式 函數(shù)模式調(diào)用
function funcStrict() {
? ? "use strict";
? ? console.log('嚴(yán)格模式-函數(shù)模式-this', this);
}
funcStrict()
// 2 作為方法調(diào)用?
function myFunc0() {
? ? console.log('方法調(diào)用-this', this);
}
var methods = {
? ? myMethod: myFunc0
}
methods.myMethod()
// 3 構(gòu)造函數(shù)調(diào)用
function myFunc1() {
? ? this.status = false;
? ? console.log('構(gòu)造函數(shù)-this', this)
}
var my = new myFunc1()
// 4 call apply
function myFunc2() {
? ? var result = 0;
? ? for (var n = 0; n < arguments.length; n++) {
? ? ? ? this.result = arguments[n];
? ? }
? ? console.log('call apply-this', this)
}
var test = {};
myFunc2.apply(test, ['ex']);
myFunc2.call(test, 'ex');
4.箭頭函數(shù)沒有單獨(dú)的this值,this創(chuàng)建時(shí)確定
5.所有函數(shù)均可使用bind方法重虑,創(chuàng)建新函數(shù)践付,并綁定到bind方法傳入的參數(shù),被綁定的函數(shù)與原始函數(shù)具有一致的行為
https://www.cnblogs.com/jiaozhuo/p/5751002.html
document.getElementById('test2').onclick = function(color) {
? ? console.log(this)
? ? color = color || "#333333";
? ? this.style.color = color;
}.bind(document.getElementById('text'), "#ffcc33"); //黃色