JavaScript 函数参数、作用域及apply,call, this关键字

全局作用域


不在任何函数内定义的变量就具有全局作用域。
任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误。

var name = 'Amy';
alert(name); // 'Amy'
alert(window.name); // 'Amy'

函数作用域


无块级作用域,在for循环等语句块中是无法定义具有局部作用域的变量 ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量

function suma() {
    var sum = 0;
    for (let i=0; i<100; i++) {
        sum += i;
    }
    i += 1; // SyntaxError
}

名字空间

函数中的this关键字(在对象中绑定的函数,成为这个对象的方法)

问题1:在对象外部定义函数,在内部把该函数赋值给函数,直接调用函数,this找不到对象,以对象的方法调用,this为当前对象。
function say() {
console.log('my name is '+this.name)
}
var Amy ={
     name:'Amy',
     say:say
}
Amy.say()//my name is Amy
say()//my name is
问题二:先拿到对象的函数,再进行调用也会报错
function say() {
console.log('my name is '+this.name)
}
var Amy ={
     name:'Amy',
     say:say
}
var fn = Amy.say
fn()
}
问题三:在函数内部定义的函数,并不能和对象绑定,this又指向undefined

常用解决方法 — var that = this; 在方法内部捕获对象,之后再使用.

var Amy ={
     name:'Amy',
     say:function(){
         var that =this
         console.log(this.name)//'Amy'
         function hello(){
             console.log(this.name)//NaN
             console.log(that.name)//'Amy'
         }
         return hello()
     }
}
Amy.say()

绑定函数对象


1、apply
getAge.apply(xiaoming,[])

function say(firstName) {
console.log('my name is '+ this.name + ' firstName '+ firstName)
}
var Amy ={
     name:'Amy',
     say:say
}
say.apply(Amy,['Chen'])//my name is Amy firstName Chen

1、call

function say(firstName) {
console.log('my name is '+ this.name + ' firstName '+ firstName)
}
var Amy ={
     name:'Amy',
     say:say
}
say.call(Amy,'Chen')//my name is Amy firstName Chen

参数:arguments:


它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array

参数:rest: ES6标准引入,将剩余参数组成新数组

function sum(...res) {
    return res.reduce((previous, current) => {
    return previous + current;
  });
}

console.log(sum(1,3,4,5,6))//19

你可能感兴趣的:(JavaScript 函数参数、作用域及apply,call, this关键字)