js中的变量提升与函数提升

先看看一个简单的代码

var str=‘Hello World‘;
alert(str);//弹出 Hello World

再看一段代码:

var v=‘Hello World‘;
(function(){
    alert(v);
})()
//和我们预期的一样,还是弹出 Hello World

那么铺垫完了,继续coding

var str=‘Hello World‘;
(function(){
    alert(str);
    var str=‘I love coding...‘;
})()

//出乎我们的意料,弹出 undefined ,蜜汁尴尬了哈

来来来…

继续蜜汁尴尬,

var foo = 1;
function bar() {
   if (!foo) {
           var foo = 10;
   }
   alert(foo);
}
bar();// 10

再来:

var a = 1;
function b() {
   a = 10;
   return;
   function a() {}
}
b();
alert(a); //1

1.变量提升

就是把变量提升提到函数的top的地方。同时需要注意的是变量提升只是提升变量的声明,并不会把赋值也提升上来。比如:

(function(){
    var a=‘One‘;
    var b=‘Two‘;
    var c=‘Three‘;
})()

实际上它是这样子的:

(function(){
    var a,b,c;
    a=‘One‘;
    b=‘Two‘;
    c=‘Three‘;
})()

那么现在我们分析下刚才出现很尴尬的结果

var str=‘Hello World‘;
(function(){
    alert(str);
    var str=‘I love coding...‘;
})()

其实,根据我么根据上面变量提升原件以及js的作用域(块级作用域)的分析,得知 上面代码真正变成如下:

var str=‘Hello World‘;
(function(){
    var str;
    alert(str);
    str=‘I love you‘;
})()

所以,才会提示说 undefined

这里,我们应该受到启发:我们在写js code 的时候,我们需要把变量放在函数级作用域的顶端,比如我在上面所举的例子:var a,b,c;。以防止出现意外。

2.函数提升

函数提升是把整个函数都提到前面去。在我们写js code 的时候,我们有两种写法,一种是函数表达式,另外一种是函数声明方式。我们需要重点注意的是,只有函数声明形式才能被提升。例子说明:

//函数声明方式提升【成功】
function myTest(){
    foo();
    function foo(){
        alert("我来自 foo");
    }
}
myTest();// 我来自 foo
//函数表达式方式提升【失败】
function myTest(){
   foo();
   var foo =function(){
        alert("我来自 foo");
    }
}
myTest();//Uncaught TypeError: foo is not a function

3.作用域链

3.1变量必须先声明后使用,函数可以先使用、后声明

原因是:函数有预加载的过程(函数声明先于其他执行代码进入内存)。本质还是函数的声明在前,使用在后。

console.log(subject);//undefined
var subject="javascript";
//var命令会发生”变量提升“现象,
//即变量可以在声明之前使用,值为undefined

//函数可以先使用、后声明
f1();//I am f1 function
function f1(){
    console.log("I am f1 function");
}

注意:同名变量和同名函数同时存在的时候,分析其执行顺序即可,函数声明第一个执行,其他代码顺序执行。

//同名变量和同名函数同时存在的时候,
//分析其执行顺序即可,函数声明第一个执行,
//其他代码顺序执行。
var f1="subject";
f1();
function f1(){
    console.log("I am f1 function");
}
//Uncaught TypeError: f1 is not a function
f1();//I am f1 function
var f1="subject";
console.log(f1);//subject
function f1(){
    console.log("I am f1 function");
}

3.2 内部环境可以访问外部环境的变量,反之亦然。

环境:每一个函数内部都是一个环境,最外边是全局变量

两种类型:函数环境、全局环境

var week="Sunday";
function f1(){
    var weather="sunshine";
    console.log("星期:"+week); //星期:Sunday
}
f1();
console.log("气候:"+weather);//Uncaught ReferenceError: weather is not defined

3.3 变量的作用域是声明时决定的,而不是运行时。

//变量的作用域是声明时决定的,而不是运行时

//全局变量,可以同时给f1和f2访问
var week="Sunday";
function f1(){
    console.log("星期:"+week);
}
function f2(){
    //局部变量,只能给f2本身子级访问
    var week="Monday";
    f1();//该f1无论在任何地方访问,都只能访问到Sunday的信息
}
f2();//星期:Sunday
//变量的作用域是声明时决定的,而不是运行时

//全局变量,可以同时给f1和f2访问
var week="Sunday";
function f1(){
    console.log("星期:"+week);
}
week="Monday";
f1();//星期:Monday

3.4 执行环境可以访问变量的类型和优先级

//执行环境可以访问变量的类型和优先级
//形参<外部变量   //形参优先级高
var week="Sunday";//外部变量
function f1(){
    function f2(week){//形参
        console.log("星期:"+week);
    }
    f2("Monday");
}
f1();//星期:Monday

如果 觉得文章不错,可以请博主喝一杯奶茶哦!!!

 

原文地址:https://www.cnblogs.com/zuobaiquan01/p/8414325.html

时间: 2024-12-28 09:33:35

js中的变量提升与函数提升的相关文章

JavaScript系列文章:变量提升和函数提升

第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有

一个例子,变量提升和函数提升就是这么简单!

为啥要进行变量提升和函数提升? 引擎在读取js代码的过程中,分为两步.第一个步骤是整个js代码的解析读取,第二个步骤是执行. 在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面. 记住两句话 1.变量提升只会提升变量名的声明,而不会提升变量的赋值初始化. 2.函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上. 记住这两句话,就可以从容不迫的撸代码了! console.log(a); var a=1; console.lo

278 执行上下文、执行上下文栈:变量提升与函数提升,执行上下文,执行上下文栈,全局执行上下文,函数执行上下文,练习题

变量提升与函数提升 变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined) 函数提升: 在函数定义语句之前, 就执行该函数 先有变量提升, 再有函数提升 变量声明提升.函数声明提升 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_变量声明提升.函数声明提升</title> &l

对javascript变量提升跟函数提升的理解

在写javascript代码的时候,经常会碰到一些奇怪的问题,例如: console.log(typeof hello); var hello = 123;//变量 function hello(){//函数声明 } console.log(typeof hello); var hello = function(){//函数表达式 } console.log(typeof hello);//function number function 对于为什么会是这样的一个结果:function numb

变量提升,函数提升概念及相关题

之前总是对变量提升,函数提升一知半解,随着时间的推移,理解的越来越深刻,接下来就写一写,有不对的地方请大家指出来. 1) 变量提升 1. 通过var定义(声明)的变量, 在定义语句之前就可以访问到2. 值: undefined console.log(a)//undefined var a = 1111; console.log(a)//1111 等同于 var a = undefined console.log(a) //undefined a = 1111; console.log(a) /

JS中的变量和输入输出

一.使用JS的三种方式 1.在HTML标签中,直接内嵌JS(并不提倡使用) <button onclick="alert('点你咋地')">点我</button> >>> 不符合w3c关于内容与行为分离的要求 2.在HTML页面中使用<script></script>包裹JS代码 <script type="text/javascript"> //JS代码 </script>

JS中的日期内置函数

用JS中的日期内置函数实现在页面显示:“今天是:2013年9月26日14:32:45”. var date=new Date(Date.parse('9/26/2013 14:32:45'));   写出JS中声明对象的三种方法. Var obj={ name:名字, Say:function(){ Alert(‘sssss’); } }     Var obj=new Object();     Var obj={} Obj.name=’名字’; Obj.say=function(){ Ale

JS中,子类调用超类函数

概述 JS虽然并不直接具备面向对象的特性,但仍可以通过prototype来模拟面向对象的继承和多态等特性.和大多数面向对象语言(例如C++,Java等)相比,JS来实现面向对象仍稍显繁琐和抽象,需要对JS的prototype模型有深入的理解. 在开发过程中,有时候会遇到这样一个问题:如果在子类中"覆盖"了超类的某个方法,但仍需要在子类方法中调用一次超类方法,这时候应该怎么做?如果是Java,一个简单的super关键字即可解决问题,但如果是JS呢? 解决问题的最基本方法可以是:在子类中,

JavaScript入门:003—JS中的变量

编程语言都是相同的,JS中也是有变量的.首先JS的变量是区分大小写的,这个需要注意,比如number和Number是不同的变量.不管是常用类型的,还是对象类型,比如 Object obj和Object Obj是两个对象.然后是对变量赋值,这个基本都一样,可以先声明再赋值, var i; i=0; 也可以声明时赋值, var i=2; 而变量如果你不重新赋值,它是不会改变的,比如 var i=2: var i; 因为i没有重新赋值,所以i还是2.而对于对象变量则比较有意思,不需要向那些java,c

JS中的变量及注意点

参考: http://www.blogjava.net/baoyaer/articles/105921.html http://zhidao.baidu.com/link?url=8swl8GsS3UlFcNqxXBPI0LdpIzKx0WSxP-idnhA9oCZElLY8NMwAsiIljfyRuzp0lrBeX72SoufdDUOHc0r5D_ 程序: function printVar(v){ document.write(v+ '<br>'); } printVar("**