最近家里蹲,太闲了,写写笔记
作用域
可以在任意地方被读取或者修改;
var abc = 123 // 全局变量,不可删除;在函数或者代码块{}之外定义
function myFunction(){
abc = 456 // 本质是window上的属性,可以被删除,window是全局对象
}
外层作用域无法访问函数内的作用域
function myFunction1(){
var a = 123;
}
console.log(a) // a is not defined
如果想要访问函数内部作用域,可以使用return或者闭包
function myFunction2(val){
return val
}
console.log(myFunction2(123)) // 123,使用return方法
function myFunction3(val){
var result = 'hello'+val;
function son(){
return result
}
return son()
}
console.log(myFunction3(123))
// hello123,使用闭包;return是对外交流的出口,可以返回子函数,子函数可以向上获取数据,作用域链可以使用原型链去理解
ES6中在{}中使用let声明定义不会提升
if(true){
let a = 123;
console.log(a) // 123
}
console.log(a) // a is not defined
ES5中this指向调用者;独立函数,定时器this指向window
var a = 3;
function test(){
console.log(this.a);
}
test() // 3
test.bind({a:2})() // 2
ES6中特殊情况为箭头函数,this的指向为方法定义时的指向
var obj = {
name: 'test',
sayHi: function(){
console.log(this.name)
}
}
obj.sayHi() // test
var name = 666
var obj = {
name: 'test',
sayHi: () =>{
console.log(this.name)
}
}
obj.sayHi() // 666 箭头函数,this的指向为方法定义时的指向
let与const
- let与var的区别
let不能提升变量,在块之外不能访问
let定义的值不能window访问属性
let不可以重复赋值
- const
定义常量,不允许常量再次赋值;先声明,再赋值也不被允许