<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>
函数面试题
最新推荐文章于 2021-07-17 13:06:51 发布