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