练习题------变量提升&闭包

  1. 写出下面代码输出的结果
console.log(a);//=>undefined
var a = 12;//全局下声明变量a,并且给全局window添加了一个a的属性,值为12。
a = 13;//给全局的a属性重新赋值a
console.log(a);//=>13
console.log(a);//=>直接报错,因为全局下没有声明过a这个属性。Uncaught ReferenceError: a is not defined
    at <anonymous>:1:13
let a = 12;
a = 13;
console.log(a);
console.log(a);//=>报错,全局下没有a这个属性Uncaught ReferenceError: a is not defined
a = 13;
console.log(a);
  1. 写出下面代码输出的结果
var a = 12;
var a = 13;
console.log(a);//=>13,声明了一个全局变量a,并且先后赋值12和13
let a = 12;//=>报错,let不允许重复声明,词法解析阶段就会报错Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 13;
console.log(a);
  1. 写出下面代码输出的结果
console.log(a, b);
var a = 12,
   b = 12;
function fn() {
   console.log(a, b);
   var a = b = 13;
   console.log(a, b);
}
fn();
console.log(a, b);
  1. 写出下面代码输出的结果
console.log(a, b, c);
var a = 12,
   b = 13,
   c = 14;
function fn(a) {
   console.log(a, b, c);
   a = 100;
   c = 200;
   console.log(a, b, c);
}
b = fn(10);
console.log(a, b, c);
  1. 写出下面代码输出的结果
console.log(a);
if(!('a' in window)){
   var a = 13;
}
console.log(a);
  1. 写出下面代码输出的结果
fn();
function fn(){ console.log(1); }
fn();
function fn(){ console.log(2); }
fn();
var fn = function(){ console.log(3); }
fn();
function fn(){ console.log(4); }
fn();
function fn(){ console.log(5); }
fn();
  1. 写出下面代码输出的结果
f = function () {return true;}
g = function () {return false;}
~function () {
    if (g() && [] == ![]) {
        f = function () {return false;}
        function g() {return true;}
    }
}();
console.log(f());
console.log(g());
  1. 写出下面代码输出的结果
console.log(typeof a);
console.log(typeof a);
let a;
  1. 写出下面代码输出的结果
var ary = [12, 23];
function fn(ary) {
    console.log(ary);
    ary[0] = 100;
    ary = [100];
    ary[0] = 0;
    console.log(ary);
}
fn(ary);
console.log(ary);
  1. 写出下面代码输出的结果(如何查找上级作用域和堆栈内存释放问题)
var n = 1;
function fn() {
    var n = 2;
    function f() {
        n--;
        console.log(n);
    }
    f();
    return f;
}
var x = fn();
x();
console.log(n);
var i = 5;
function fn(i) {
    return function (n) {
        console.log(n + (++i));
    }
}
var f = fn(1);
f(2);
fn(3)(4);
fn(5)(6);
f(7);
console.log(i);
var i = 20;
function fn() {
    i-=2;
    return function (n) {
        console.log((++i)-n);
    }
}
var f=fn();
f(1);
f(2);
fn()(3);
fn()(4);
f(5);
console.log(i);

=======================================================================
1、

console.log(a); 
var a=12; 
function fn(){
	console.log(a); 
	var a=13;	
}
fn();   
console.log(a);

/*
 A、undefined  12 13             
 B、undefined undefined 12   
 C、undefined undefined 13         
 D、有程序报错
*/

2、

console.log(a); 
var a=12;
function fn(){
	console.log(a);
    a=13;
}
fn();
console.log(a);

/*
 A、undefined  12 13             
 B、undefined undefined 12   
 C、undefined undefined 13         
 D、有程序报错
*/

3、

console.log(a);
a=12;
function fn(){
	console.log(a);
	a=13;	
}
fn();
console.log(a);

/*
 A、undefined  12 13             
 B、undefined undefined 12   
 C、undefined undefined 13         
 D、有程序报错
*/

4、

var foo=1; 
function bar(){
    if(!foo){
        var foo=10; 
    }
    console.log(foo); 
}
bar();

/*
 A、1     
 B、10     
 C、undefined    
 D、报错
*/

5、无需画图

var n=0; 
function a(){
	var n=10; 
	function b(){
		n++; 
	    console.log(n); 
    }
    b();
    return b; 
}
var c=a();
c(); 
console.log(n);


/*
 A、1 1 1   
 B、11 11 0  
 C、11 12 0  
 D、11 12 12
*/

6、

var a=10,b=11,c=12;
function test(a){
     a=1;
     var b=2;
     c=3;
}
test(10);
console.log(a);  
console.log(b);   
console.log(c);

/*
 A、1 11 3   
 B、10 11 12  
 C、1 2 3   
 D、10 11 3
*/

7、

if(!("a" in window)){
   var a=1;
}
console.log(a);

/*
 A、1   
 B、undefined   
 C、报错   
 D、以上答案都不对
*/

8、

var a=4;
function b(x,y,a) {	   
     console.log(a); 
     arguments[2]=10;        
     console.log(a); 
}
a=b(1,2,3);   
console.log(a); 

/*
 A、3  3  4   
 B、3  10  4   
 C、3  10  10   
 D、3  10  undefined
*/

9、

var foo='hello'; 
(function(foo){
   console.log(foo);
   var foo=foo||'world';
   console.log(foo);
})(foo);
console.log(foo);

/*
 A、hello hello hello   
 B、undefined world  hello   
 C、hello world world   
 D、以上答案都不正确
*/

10、需画图

var a=9; 
function fn(){ 
	a=0; 	   
    return function(b){ 
	    return b+a++; 
    }    
}
var f=fn();
console.log(f(5));
console.log(fn()(5));
console.log(f(5));
console.log(a);

/*
 A、6 6 7 2   
 B、5 6 7 3   
 C、5 5 6 3   
 D、以上答案都不正确 
*/
二、问答题(需要画图)

1、

var ary=[1,2,3,4];
function fn(ary){
	ary[0]=0;    
	ary=[0];    
	ary[0]=100;    
	return ary; 
}
var res=fn(ary);    
console.log(ary);    
console.log(res);

2、

function fn(i) {
    return function (n) {
        console.log(n + (i++));
    }
}
var f = fn(10);
f(20);
fn(20)(40);
fn(30)(50);
f(30);

3、

var i = 10;
function fn() {
    return function (n) {
        console.log(n + (++i));
    }
}
var f = fn();
f(20);
fn()(20);
fn()(30);
f(30);

4、无需画图

var test = (function(i){
    return function(){
        alert(i*=2);
    }
})(2);
test(5);

5、

var a=1;
var obj ={
   "name":"tom"
}
function fn(){
   var a2 = a;
   obj2 = obj;
   a2 =a;
   obj2.name =”jack”;
}
fn();
console.log(a);
console.log(obj);

6、无需画图

var a = 1;
function fn(a){
    console.log(a)
    var a = 2;
    function a(){}
}
fn(a)

7、

var a=0,
	b=0;
function A(a){
	A=function(b){
    	alert(a+b++);
	};
    alert(a++);
}
A(1);
A(2);
三:附加思考题(面试题)

1、以下代码的功能是要实现为5个input按钮循环绑定click点击事件,绑定完成后点击1、2、3、4、5五个按钮分别会alert输出0、1、2、3、4五个字符。(腾讯)

  • 请问如下代码是否能实现?
  • 如果不能实现那么现在的效果是什么样的?
  • 应该做怎样的修改才能达到我们想要的效果,并说明原理?
<div id="btnBox">
	<input type="button" value="button_1" />
    <input type="button" value="button_2" />
    <input type="button" value="button_3" />
    <input type="button" value="button_4" />
    <input type="button" value="button_5" />
</div>

<script type="text/javascript">
    var btnBox=document.getElementById('btnBox'),
        inputs=btnBox.getElementsByTagName('input');
    var l=inputs.length;
    for(var i=0;i<l;i++){
	    inputs[i].onclick=function(){
		    alert(i);
	    }
    }
</script>

2、document.parentNode 和 document.parentnode 的区别?(腾讯)

3、你理解的闭包作用是什么,优缺点?(乐视)

4、简述let和var的区别

=======================================================================

  1. 写出下面代码输出结果

    var num = 10;
    var obj = {num: 20};
    obj.fn = (function (num) {
        this.num = num * 3;
        num++;
        return function (n) {
            this.num += n;
            num++;
            console.log(num);
        }
    })(obj.num);
    var fn = obj.fn;
    fn(5);
    obj.fn(10);
    console.log(num, obj.num);
    
  2. 写出下面代码输出结果

    var fullName='language';
    var obj={
    	fullName:'javascript',
    	prop:{
    		getFullName:function(){
    			return this.fullName;
    		}
    	}
    };
    console.log(obj.prop.getFullName());
    var test=obj.prop.getFullName;
    console.log(test());
    
    var name='window';
    var Tom={
    	name:"Tom",
    	show:function(){
    		console.log(this.name);
    	},
    	wait:function(){
    		var fun=this.show;
    		fun();
    	}
    };
    Tom.wait();
    
  3. 腾讯面试题

    function fun(){
    	this.a=0;
    	this.b=function(){
    		alert(this.a);
    	}
    }
    fun.prototype={
    	b:function(){
    		this.a=20;
    		alert(this.a);
    	},
    	c:function(){
    		this.a=30;
    		alert(this.a)
    	}
    }
    var my_fun=new fun();
    my_fun.b();
    my_fun.c();
    
  4. 怎么规避多人开发函数重名的问题?(百度搜索)

  5. 360面试题

    window.val=1; 
    var json={ 
        val:10, 
        dbl:function(){ 
            this.val*=2; 
        } 
    } 
    json.dbl(); 
    var dbl = json.dbl; 
    dbl(); 
    json.dbl.call(window); 
    alert(window.val + json.val);
    
    (function(){
        var val =1;
        var json ={
              val:10,
              dbl:function(){
                val*=2;
              }
        };
        json.dbl();
        alert(json.val+val);
    })();
    
    function C1(name){
        if(name) {
        	this.name = name;
        }
    }
    function C2(name){
        this.name =name;
    }
    function C3(name){
        this.name = name ||'join';
    }
    C1.prototype.name='Tom';
    C2.prototype.name='Tom';
    C3.prototype.name='Tom';
    alert((new C1().name)+(new C2().name)+(new C3().name));
    
  6. 滴滴面试题

    var foo = {
      bar: function () {
        console.log(this);
      }
    };
    foo.bar(); 
    (foo.bar)(); 
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值