进阶4:JS作用域链 & JS引用类型

题干

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

(function(){alert('我是匿名函数')}())

创建一个独立的作用域。
这个作用域里面的变量,外面访问不到(即避免「变量污染」)。
打分
评语

ok
题干

求n!,用递归来实现。
回答内容

function factorial(n){
if(n === 1){
return 1
}
return n * factorial(n-1)
}
factorial(3) //6
打分
评语

没有考虑 n为0 的情况
题干

以下代码输出什么?

    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('男');

回答内容

"name:"
"饥人谷"
"age:"
2
"sex:"
"男"
[object Arguments] {
0: "饥人谷",
1: 2,
2: "男"
}
"name"
"valley"
"name:"
"小谷"
"age:"
3
"sex:"
undefined
[object Arguments] {
0: "小谷",
1: 3
}
"name"
"valley"
"name:"
"男"
"age:"
undefined
"sex:"
undefined
[object Arguments] {
0: "男"
}
"name"
"valley"
打分
评语
题干

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

   function sumOfSquares(){
   }
   var result = sumOfSquares(2,3,4)
   var result2 = sumOfSquares(1,3)
   console.log(result)  //29
   console.log(result2)  //10

回答内容

function sumOfSquares(){
var sum=0;
for(var i=0;i

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

    (function(){alert('我是匿名函数')}())

    创建一个独立的作用域。
    这个作用域里面的变量,外面访问不到(即避免「变量污染」)。

    ok

  2. 求n!,用递归来实现。

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

    没有考虑 n为0 的情况

  3. 以下代码输出什么?

        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('男');
    
    

    "name:"
    "饥人谷"
    "age:"
    2
    "sex:"
    "男"
    [object Arguments] {
    0: "饥人谷",
    1: 2,
    2: "男"
    }
    "name"
    "valley"
    "name:"
    "小谷"
    "age:"
    3
    "sex:"
    undefined
    [object Arguments] {
    0: "小谷",
    1: 3
    }
    "name"
    "valley"
    "name:"
    "男"
    "age:"
    undefined
    "sex:"
    undefined
    [object Arguments] {
    0: "男"
    }
    "name"
    "valley"

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

       function sumOfSquares(){
       }
       var result = sumOfSquares(2,3,4)
       var result2 = sumOfSquares(1,3)
       console.log(result)  //29
       console.log(result2)  //10
    
    

    function sumOfSquares(){
    var sum=0;
    for(var i=0;i sum=sum+arguments[i]*arguments[i];
    }
    return sum;
    }
    var result = sumOfSquares(2,3,4)
    var result2 = sumOfSquares(1,3)
    console.log(result) //29
    console.log(result2) //10

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

        console.log(a);
        var a = 1;
        console.log(b);
    
    

    console.log(a); // undefined。因为下面的var a=1相当于var a,a=1。即声明了变量a也给a赋值了,因为变量提升的原因,所以在执行第一句时知道了a已经被声明但是却没有被赋值。所以显示为undefined。
    var a = 1;
    console.log(b);// 报错,b is not defined。代码中没有声明变量b也没有对其赋值,所以显示为b is not defined,而不是undefined。

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

        sayName('world');
        sayAge(10);
        function sayName(name){
            console.log('hello ', name);
        }
        var sayAge = function(age){
            console.log(age);
        };
    
    

    // hello world
    // sayAge is not a function。error,因为下面这个是函数表达式,而函数表达式不会声明提前,所以sayAge(10)在前面调用是无效的。

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

    var arr = [3, 4, 6]
    function squireArr( arr ){
      //补全
    }
    squireArr(arr)
    console.log(arr)  // [9, 16, 36]
    
    

    arr 被修改了

    for(var i = 0; i < arr.length; i++){
    arr[i] = arr[i] * arr[i];
    }//补全

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

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

    //10,
    function foo() {
    console.log(x)
    }里面没有x的赋值,向上找,全局变量里有赋值,所以是10.

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

    var arr = [3, 4, 6]
    function squireArr( arr ){
      //补全
    }
    var arr2 = squireArr(arr)
    console.log(arr)  // [3, 4, 6]
    console.log(arr2)  // [9, 16, 36]
    
    

    原数组不变

    var newArr = [];
    for(var i = 0; i < arr.length; i++){
    newArr[i] = arr[i] * arr[i];
    }
    return newArr;

    可以使用 map

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

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

```



// 30
function foo() {
console.log(x)
}里面没有x的赋值,向上找var x=30,所以是30.




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

```
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() //输出多少

```



// 2
function fn2(){
console.log(a)
}里没有赋值,向上找,fn1里有var a=2,所以是2




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

```
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() //输出多少

```



//1
function fn2(){
console.log(a)
}里没有赋值,向上找,全局变量里var a=1,所以是1




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

```
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() //输出多少

```



// undefined
function fn2(){
console.log(a)
}里面没有,向上找,fn3里虽然有var a=4,对自身fn3没有影响,但对内嵌函数有影响。
声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。函数是单向线,从上向下解析的。




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

```
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);

```



console.log(obj1 == obj2);
//false 因为obj1和obj2的指针所指向的在堆中的地址不一样
console.log(obj1 = obj2);
// {a:1,b:2} 将obj2赋值给obj1
console.log(obj1 == obj2);
//由于obj2赋值给obj1,两个对象所指向的在堆中的地址一致




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

```
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  //全局变量
[object Object] {
  age: 3,
  name: "jirengu"
}  //全局对象,向上找是var c = { name: 'jirengu', age: 2 },而f2(c) ,函数执行 ++obj.age,所以 age: 3。

```




写一篇关于作用域链的博客,不少于200字,附上博客链接



[http://www.jianshu.com/p/22f4115d01e6](http://www.jianshu.com/p/22f4115d01e6)




写一个深拷贝函数。



function deepCopy(oldObj) {
var newObj = {};
for(var key in oldObj) {
if(typeof oldObj[key] === 'object') {
newObj[key] = deepCopy(oldObj[key]);
}else{
newObj[key] = oldObj[key];
}
}
return newObj;
}





typeof null 也是 object

你可能感兴趣的:(进阶4:JS作用域链 & JS引用类型)