习题一
var a = 10;
function test(){
a = 100;
console.log(a)
console.log(this.a)
var a
console.log(a)
}
test()
考察点
- 变量提升
- 预解析
- this(函数无调用者 this==window)
var a = 10;
function test(){
var a
a = 100;
console.log(a)
console.log(this.a)
console.log(a)
}
test()
若将上面的var改为let,则直接报错,因为let没有变量提升
习题二(非严格模式)
(function(){
var a = b = 3
})()
console.log(a)
console.log(b)
考察点
- 自执行函数
- 作用域
var a = b = 3就是b =3;var a = b
a是在函数内部定义的,外部访问不到,b只是在函数内部进行了赋值,将var b 预解析到全局
若是
(function(){
var a = b = 3
})()
console.log(b)
console.log(a)
习题三
for (var i = 1;i<=3;i++){
setTimeout(function(){
console.log(i)
},0)
}
考察点
- js的事件循环
- 等待队列
- 异步
js是单线程(一次只能运行一个程序),如何去执行异步呢? 答:在主线程执行时,有一个异步任务也要执行的时候,只需要把异步放进等待队列中,待主线程执行完毕再执行异步(这里共有三个异步任务 setTimeout())
如果将var 改为 let 结果是:
原因是作用域不同:var是全局作用域,let是块级作用域
ES5的作用域有 函数作用域、全局作用域 ES6新加了块级作用域
习题四
function fun(v){
console.log(v)
var n = 456
console.log(n)
}
var n = 123;
fun(n)
考察点
- 作用域
- 变量提升
- 参数
var n;
function fun(v){
var n;
console.log(v);
n = 456;
console.log(n)
}
n = 123;
fun(n)
若没有参数n
function fun(){
console.log(n)
var n = 456
console.log(n)
}
var n = 123;
fun(n)
考察点
- 作用域
- 变量提升
- 参数
习题五
function fun(){
console.log(fun)
fun = 456
console.log(fun)
}
fun()
var fun = 123
变量和函数同名,函数优先
预解析中函数的优先级大于var
function fun(){
console.log(fun)
fun = 456
console.log(fun)
}
var fun = 123
fun()
将函数fun赋值给123,故fun()不再是函数
习题六
var n = 123
function f1(){
console.log(n)
}
function f2(){
var n = 456;
f1()
}
f2()
console.log(n)
考察点
- 预解析
- 作用域 f1() 在 f2()中执行,但是f1()无调用者,所以f1()的作用域是window
习题七
var length = 100
function f1(){
console.log(this.length)
}
var obj = {
x:10,
f2:function(f1){
f1(); // 无调用者,this指向全局
arguments[0]() // 无调用者,作用域arguments对象,length刚好是是数组长度,f2传入俩个参数
}
}
obj.f2(f1,1) //f2的调用者是obj
arguments[0]()就是f1()
考察点
- 预解析
- 作用域
- arguments--js内置对象,可以理解为参数数值,里面包含所有传入的参数 eg:
function arg(){
console.log(arguments)
}
arg(1,2,3,'f',3)
习题八
function f(){
console.log(this.a)
}
var obj = {
a:2,
f:f // 这个值是函数f()
}
var f2 = obj.f;
var a = 'hello'
f2() // 无调用者 this == window
考察点
- 预解析
- 字面量
- 作用域
习题九
function f(s){
console.log(this.a, s)
return this.a + s
}
var obj = {
a:2
}
var f2 = function(){ // 无参数接收 arguments接收
return f.apply(obj,arguments) /// 相当于obj调用f函数
}
var b = f2(3)
console.log(b)
考察点
-
预解析
-
字面量
-
apply (执行一个函数,改变this的指向)
apply(参数一,参数二),参数一:作用域,改变之后this的指向,参数二:数组
-
argumrnts
-
作用域
function f(s){
console.log(this.a, s)
return this.a + s
}
var obj = {
a:2
}
var f2 = function(){
return f.call(obj,...arguments)
}
var b = f2(3)
console.log(b)
call(参数一,参数二),参数一:作用域,改变之后this的指向,参数二:直接写入,用逗号隔开