javascript作用域和作用域链

2019-03-08  本文已影响0人  原上的小木屋

立即执行函数表达式是什么?有什么作用?

  1. 声明一个匿名函数
  2. 马上调用这个匿名函数
  1. 只有一个作用:创建一个独立的作用域。
  2. 这个作用域里面的变量,外面访问不到(即避免「变量污染」)。

求n!,用递归来实现。

function factorial(n){
    if(n==1){return 1}
    return n*factorial(n-1)
}

以下代码输出什么?

    function getInfo(name, age, sex){
        console.log('name:',name);
        console.log('age:', age);
        console.log('sex:', sex);
        console.log(arguments);
        arguments[0] = 'valley';
        console.log('name', name);
    }

    getInfo('飞天虎', 2, '男');
    getInfo('小虎', 3);
    getInfo('男');
  1. getInfo('飞天虎', 2, '男');输出
  1. getInfo('小虎', 3);输出
  1. getInfo('男');输出

写一个函数,返回参数的平方和?

var sum=0;
for(i=0;i<arguments.length;i++){sum=sum+arguments[i]**2}
return sum;

如下代码的输出?为什么?

    console.log(a);
    var a = 1;
    console.log(b);
  1. console.log(a)输出undifined
  1. console.log(b)会报错

如下代码的输出?为什么?

    sayName('world');
    sayAge(10);
    function sayName(name){
        console.log('hello ', name);
    }
    var sayAge = function(age){
        console.log(age);
    };
  1. sayName('world') 会输出 hello world
  1. sayAge(10)会报错

写一个函数squireArr,其参数是一个数组,作用是把数组中的每一项变为原值的平方

var arr = [3, 4, 6]
function squireArr( arr ){
  for(i = 0 ; i < arr.length ; i++){ arr[i] = arr[i]**2 }
}
squireArr(arr)
console.log(arr)  // [9, 16, 36]

如下代码的输出?为什么?

var x = 10
bar() 
function foo() {
  console.log(x)
}
function bar(){
  var x = 30
  foo()
}

写一个函数squireArr,其参数是一个数组,返回一个新的数组,新数组中的每一项是原数组对应值的平方,原数组不变

var arr = [3, 4, 6]
function squireArr( arr ){
    var newArr = [];
    for(var i = 0; i < arr.length; i++){
        newArr[i] = arr[i] * arr[i];
    }
    return newArr;
}
var arr2 = squireArr(arr)
console.log(arr)  // [3, 4, 6]
console.log(arr2)  // [9, 16, 36]

如下代码的输出?为什么?

var x = 10;
bar() 
function bar(){
  var x = 30;
  function foo(){
    console.log(x) 
  }
  foo();
}    

如下代码的输出?

var a = 1
function fn1(){
  function fn2(){
    console.log(a)
  }
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出多少

如下代码的输出?

var a = 1
function fn1(){
  function fn3(){
    var a = 4
    fn2()
  }
  var a = 2
  return fn3
}
function fn2(){
  console.log(a)
}
var fn = fn1()
fn() //输出多少

如下代码的输出?为什么?

var a = 1
function fn1(){

  function fn3(){
    function fn2(){
      console.log(a)
    }
    fn2()
    var a = 4
  }
  var a = 2
  return fn3
}
var fn = fn1()
fn() //输出多少

如下代码的输出?为什么?

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
  1. 第一个console.log()输出false
  1. 第二个console.log()输出{a:1,b:2}
  2. 第三个console.log()输出true

如下代码的输出?为什么?

var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
  ++n
}
function f2(obj){
  ++obj.age
}

f1(a) 
f2(c) 
f1(c.age) 
console.log(a) 
console.log(c)     
  1. 第一个console.log(a)输出1
  1. 第二个console.log(c)输出{name: "jirengu" , age : 3}

写一个深拷贝函数。

function deepcopy(oldobj){
        var newobj={};
        for(var key in oldobj){
               if(typeof(key)=='object'){newobj[key]=deepcopy(oldobj[key])}
        else{newobj[key]=oldobj[key]}  
        }
        return newobj
}
上一篇 下一篇

猜你喜欢

热点阅读