zoukankan      html  css  js  c++  java
  • js function随笔

    function test () {
        c=5;
        alert(c);    
    }
    test();

    当我们在执行test函数时,浏览器并不会报c未定义的错误,因为在js中,变量定义是通过var关键字,如果没有通过var定义,而直接进行引用,js引擎会自动把这个c定义为全局变量。

    unction test () {
        c=5;
        alert(c);    
    }
    
    test();
    
    (function test2 () {
        alert(c)
    })();

    所以test2函数也可以拿到这个c。

     function test2 () {
    
    alert(c);
    
    console.log(c);
    
    var c=2;
    
    }

    test2();

    这个js引擎在编译时会先将c定义,但是不会给他赋值,赋值要在函数执行的时候,所以不会报c is not defined

    但是c会赋值为undefined

    今天参加了一场面试,面试过程中做了三道js的笔试题,题目只记得了大概了,不过也没关系。

           var a=1;
                var obj={b:2}
                function fn(){}
                fn.c=6;
                function test(a,obj,fn){
                    a=3;
                    obj.b=4;
                    fn.c=5
                }
                
                test(a,obj,fn)
                alert(a);
                alert(obj.b);
                alert(fn.c);
                alert(a+obj.b+fn.c);

    大意就是这样吧!问最后alert(a+obj.b+fn.c);的值会是多少!大家不妨先自己分析分析。答案是10。a等于1,obj.b等于4,fn.c等于5。分析如下

    首先基本类型的传递方式为按值传递,也就是说test(a,obj,fn),中的a是全局变量的一个拷贝,在这个test函数里面改变a的值是不会影响外面全局变量a的值的,所以全局变量a的值依然是1,而对象是按引用类型传递的,也就是test函数中的obj参数,传递的将是指向该对象的一个引用。(感觉就像c里面的指针,传递的是一个指向某个内存的地址指针,通过该指针来找到对应的内存地址,不知道这个比方打的正不正确)。那么我们在函数里面改变obj.b实际上是会改变全局变量中obj.b的值的,而fn.c也是一个道理,因为在js中函数也是对象。那么很自然就得到了10.建议大家去了解一下按值传递和按引用传递的相关内容,高程里面好像有。

    还有一个题目

          var name="djl";
                function echo(){
                    alert(name);
                    var name="eve";//就是变量的申明提前,但是只是执行了var name;但是此时是并没有给name赋值的,也就是说没有执行name="eve";
                    alert(name);
                    alert(age);
                }
                echo();

    因为学的如果不深入的话很肯能会得到 djl,eve,语法错误这样的答案。但实际上是undefined,eve,语法错误。因为我们知道在js中有变量申明提升的特性。

    就比如

    alert(a);
    var a;

    我们会得到undefined,而不是js引擎报错 “Uncaught ReferenceError: a is not defined”。但是我们应该还要注意,变量申明确实提升了,但是却并不会执行赋值操作,也就是说我们在后面定义var a=1;js引擎提升的部分只有var a;在提升申明的过程中并不会执行a=1这个赋值操作。所以在上面var name="eve";只会提升申明,并不会在此时执行name="eve"的赋值操作,所alert的结果为undefined而不是eve也不是djl或者报错。

    当然以上是我个人理解,感觉更好理解点。这里还有大神的理解(有点难懂):

    http://www.laruence.com/2009/05/28/863.html

    http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html

      

  • 相关阅读:
    记忆化搜索 E
    网络流 O
    线段树 B数据结构 牛客练习赛28
    N
    线段树 G
    K
    F
    补一下昨天的博客 J
    selenium-1-python
    selenium入门知识
  • 原文地址:https://www.cnblogs.com/djlxs/p/5068483.html
Copyright © 2011-2022 走看看