函数面试题

<script type="text/javascript">
// var a = b = 100;
// (function(){
//       var a=b=9;   //立即执行函数 b 为全局变量 当函数执行完抛出b=9改变了之前的b的值
//   })();
//     console.log(b); //9
//     console.log(a); //100


 // console.log(a);  //undefined    变量提前声明 赋值留在原地
 //    var a=12; 
 //   function fn(){
	// 	console.log(a); //undefined   变量提前声明 赋值留在原地  自己有的a
 //        var a=13;	
	// }
	// fn();   
 //    console.log(a);  //12


// var uname = 'jack'
// function change() {
//     alert(uname) //undefined 变量提前声明 赋值留在原地
//     var uname = 'fofoxqi'
//     alert(uname) //fofoxqi 
// }
// change()


//    var x = 1, y = z = 0;  
//    function add(n) {  
//       return n = n+1;  
//   }  
//    y = add(x); 

//    function add(n) {    //x y都是执行这段函数
//       return n = n + 3;   
//    }  
//    z = add(x);  
//    console.log(x,y,z)  //1 4 4 


    // var name = "The Window";
   // var object = {
	//   name : "My Object",

//   getNameFunc: function () {
//     return function () { 
//       return this.name;
//     };
//   }
// };
// alert(object.getNameFunc()());    //"The Window" 
//object.getNameFunc()  返回 function () {return this.name;}; 所以 this 指向全局



// fn1() // fn1 函数整体提前
// fn2() //第一次fn2调用
 
// function fn1(){
//   	console.log('fn1') //提前声明 : 用var function关键字申明的变量提前 赋值留在原地 
// }
// var fn2 = function(){
//   	console.log('fn2')
// }
// fn2() 


// var a = 10;
// function fn(){
//  	console.log(a)  //10
// }
// function fn2(f){
//  	var a =20;
//  	fn();  //这里的a指全局中的
// }
// fn2(); //10

	
fn(zhangsan);   //zhangsan 20
function fn (name){
    console.log(this)
    console.log(arguments)
    age=20;
    console.log(name,age)
    var age
}
//上面六行代码运行的时候会把函数声明提前,函数里面会把变量提前,提前之后代码相当于:
function fn(name){
	var age;
	age=20;
	console.log(name,age);
}
fn("zhangsan");
//当console.log输出name和age的时候,name参数和age都进行赋值了,所以输出的是"zhangsan" 20。


function Foo(){
    var i=0;
	return function(){
	document.write(i++);
}
}
var f1=Foo();
f2=Foo();
f1();
f1();
f2();

//输出的结果是 0 1 0

解析:这是一个闭包,闭包的作用有两个,一是可以读取函数内部的变量,二是让这些变量的值始终保存在内存中。当f1()和f2()调用时,
会创建两个执行环		境,保存各自的变量对象,之间是没有相互影响的。而同一个函数多次调用时返回值会被保存到同一个变量对象中,
因为闭包i会保存在内存中没有被释放。另外i++是先调用再+1,++i是先+1再调用,所以输出为 0 1 0。


x = 1;
var obj = {
    x: 2,
    dbl: function () {
        this.x *= 2;
        x *= 2;
        console.log(x);
        console.log(this.x);
    }
};
obj.dbl();
//this.x指向当前对象,所以this.x *= 2等同于obj.x *= 2
//而x *= 2,在当前作用域中没有找到声明,则在全局作用域下查找是否有x, x *= 2等同于window.x *= 2
//打印输出2 4,此时window.x为2, obj.x为4

var func = obj.dbl;
func();
//func()没有前缀,所以func()相当于window.func(),此时func()中的x与this.x均指向window.x
//打印输出8 8,



</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值