js变量提升小记

  作为世界上最优美的语言javascript的使用者,呵呵,js的魅力是无穷的,今天来聊聊他的魅(dan)力(teng)之一,变量提升。

  每种语言所定义的变量基本都会有一定得作用域,而js的作用域则存在着一定的陷阱。首先看一下下面一道题:

<script>
    var str1 = "haha";
    var str2 = "hehe";

    function t1() {
        console.log(str1);
        console.log(str2);

        var str2 = "kidding";
        console.log(str2);
    }

    t1();

</script>
结果是:
haha
undefine
kidding     

纳尼?hehe哪去了?结果不应该是:haha hehe kidding吗?

实际上这里就有一个变量提升的问题。如果函数写成这样,你可能就一目了然了

<script>
    var str1 = "haha";
    var str2 = "hehe";

    function t1() {     var str2;
     console.log(str1);      console.log(str2); 

     str2 = "kidding";     console.log(str2);   } 

   t1(); </script>

实际上js在解析的时候正是按照这样的执行顺序进行的,在执行到t1内部的时候,会优先找到函数内部作用域里的变量执行,而且函数内的所有var 声明function声明都会被提到函数体的最上方执行。并且var 声明会先声明之后,执行到赋值的时候再赋值。

再看下面的例子:

<script>
    function t(userName) {
        console.log(userName);

        function userName() {
            console.log(‘tom‘);
        }
    }
    t(‘toby‘);
</script>

由于function声明会被提前到函数体最上方,所以相当于这样:

function t(userName) {
        function userName() {
            console.log(‘tom‘);
        }
        console.log(userName);
    }
 t(‘toby‘);    

结果很明显是:

function userName(){

  console.log(‘tom‘);

}

但是像下面这样的函数表达式,则会把var t2进行提升,而后再对t2进行赋值

<script>  test();

  var test = function () {
        console.log(‘hello toby‘);//这里会输出什么?
    };</script>解析后变成:
<script>  var test ;  test();

  test = function () {
        console.log(‘hello toby‘);//这里会输出什么?
    };</script>

由于执行到test()的时候,test还是一个undefine所以代码会报错。

但是变量提升只是在该变量在改作用域内从未出现的时候才会发生。看下面的题:

<script>
    function t(userName) {
        console.log(userName);// (1)
        var userName = function () {
            console.log(userName);//(2)
        }
        userName();//(3)
    }
    t(‘haha‘);
</script>

如果按照刚才所说的变量提升,可能会认为结果是:

(1) 处为undefine

(2)处是

function () {
            console.log(userName);//(2)
        }实际上结果是:(1)处输出的是haha ,原因在于执行到t函数内部的时候,userName这个变量在传参的时候在这个内部作用于内已经存在了,所以不会进行变量提升,而是直接使用已经存在的userName=‘haha‘。(2)执行(3)的时候userName就是一个function了,所以(2)处的结果就一目了然了。

自己的一番拙见,如有不对,还望指出。参考链接:http://www.jianshu.com/p/43bf4f2e0d57?from=singlemessage
时间: 2024-10-19 18:39:58

js变量提升小记的相关文章

js 变量提升+方法提升

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var a = 100; function t() { alert(a); var a = 10; } t(); //输出结果为undefine

js变量提升的坑

关于js变量提升 变量提升 在js函数内部是可以直接修改全局的变量的,个人感觉是不好的设计, 但是确实存在这个概念 原理: 先查看有没有函数变量bb 查看形参有没有bb 查看全局有没有bb 报错, 找不到bb变量 修改函数内部 var bb = 1; function foo(cc){ var bb = 2; // 这里的bb, 其实是函数的局部变量 console.log(cc); } foo(bb); // 1 console.log(bb); // 1 修改的是形参 var bb = 1;

JS 变量提升

1 var a = 1; 2 function foo() { 3 console.log(a); 4 var a = 2; 5 6 } 7 8 foo(); //undefined 根据变量提升机制,最后得出undefined; 变量提升是指在一个作用域中声明的变量,JS解析时会把变量声明提升至作用域内的第一行,也就是说上面那段代码等同于: 1 var a = 1; 2 function foo() { 3 var a; //被提升至作用域内第一行 4 console.log(a); 5 va

关于JS变量提升的一些坑

1 function log(str) { 2 // 本篇文章所有的打印都将调用此方法 3 console.log(str); 4 } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名.提升 在JS中, 变量有4种基本方式进入作用域: 语言内置: 所有的作用域里都有this和arguments:(需要注意的是arguments在全局作用域是不可见的) 形式参数: 函数的形式参数会作为函数体作用域的一部分: 函数声明: 像这种形式: function foo() {

js变量提升与函数提升

在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //undefined var global = 111; console.log(global);//111 显然,上面代码处于一个全局的作用域中,在该作用域中使用var声明了一个global变量,其实际的声明过程如下: var global; console.log(global); //undefine

js变量提升的一个小坑

好久没写博客了,原本想实训结束能对整个实训项目认真总结一下,没想到回到学校一点都不轻松,最近在制作网页版简历,遇到了一个小问题,现在不总结以后肯定忙得顾不上,所以长话短说,抓紧时间写下来. 对js语法比较熟的同学可能都知道:js是没有块级作用域的,有一个新手很容易出错的地方 for(var i = 0 ; i < 10 ; i ++){ setTimeout(function(){ console.log(i) },1000*i) } 这段代码会输出10个10,而不是期望的1,2,...,10,

js变量提升和函数提升

变量,作为编程语言最基础的部分,每种语言的变量不尽相同,但又大径相庭.大部分编程语言的变量有块级作用域,如if.for.while... 但JavaScript不纯在块级作用域,而是函数作用域,并且有自己独有的特性--变量提升.(ES6新添加的let.const使其可以用块级作用域) 对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到

js变量提升

JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'Hello, ' + y; alert(x); var y = 'Bob'; } foo(); 虽然是strict模式,但语句var x = 'Hello, ' + y;并不报错,原因是变量y在稍后申明了.但是alert显示Hello, undefined,说明变量y的值为undefined.这正是因为JavaS

JS变量提升相关总结

关于变量提升这个玩意,你说简单吧,很多人做好几年前端了,仍然会晕掉,例如说我. 前几天笔试遇到一个变量提升的问题,答案是写出来了,然后面试官让我讲,我就讲不出来了. 今天分享一篇看到别人的总结,加上一点自己的理解.希望能有所帮助,自己也能记住. 1.关于声明变量的过程: var a = 1; var b = 2; 其实他的执行过程是这样的: var a; var b; a = 1; b = 2; 先声明变量,后执行赋值. 2.变量提升 function test(){     a=2;