js面试题-----作用域与闭包
1、问题代码:
var length = 10; function fn(){ console.log(this.length); } var obj = { length:5, method:function(fn){ fn(); arguments[0]() } } obj.method(fn,1);//输出10 2
解答:第一个fn执行的this是指向window 的所以this.length指的是10 而arguments[0]()可以理解为下面代码 这里的length是arguments本身的自己的length属性
var arguments = { 0:fn, 1:1, . . . length:2 }
2、问题代码
var obj = { getName:function(){ console.log(this) } } obj.getName();//obj (obj.getName)();//obj (obj.getName = obj.getName)()//window
解答: 第一个很明显 getName执行的this是obj 第二个不是很理解 大概理解为obj.getName是一个整体 自执行函数执行 也就是getName执行 所以 跟第一个一样 也是obj
第三个可以这么理解 两边赋值之后的结果为function (){console.log(this)} = function (){console.log(this)} 所以此时执行的this是代表window(第二个希望有会的可以评论讲解一下 谢谢)
题目1:说一下对变量提升的理解
答案:使用var定义的变量或者函数表达式在代码执行的时候 会先进行变量提升(声明) 即先赋值为undefined;而函数声明 会同时定义和声明
题目2:说明this几种不同的使用场景
答案:作为构造函数执行 作为对象属性执行 作为普通的函数执行 call apply bind
题目3:创建10个<a>标签,点击的时候弹出来对应的序号
答案:这里主要通过自执行函数来获取每次循环的时候的i值
var i,a; for(i = 0;i<10;i++){ (function(i){ a = document.createElement('a'); a.innerHTML = i+'<br>'; a.addEventListener('click',function(e){ e.preventDefault(); alert(i); }) document.body.appendChild(a); })(i) }
题目4:如何理解作用域
答案:函数执行的时候 就会创建一个私有的作用域供里面的代码执行。当函数里面要访问变量的时候,首先会在自己的作用域当中进行查找,如果找不到会到其父级的作用域中继续查找,这就形成了一个作用域链。
题目5:实际开发中闭包的应用
答案:延长变量的生命周期,可以是函数外面访问函数内部的变量。