js 函数和变量的提升

1. 函数的作用域:

js中 ,函数的作用域为函数,而不是大括号。

var hei = 123;
if(true){
hei = 456;
}
console.log(hei);// 456;
var hei = 123;
if(true){
(function(){ var hei = 456;})();
}
console.log(hei); // 123

函数内部可以用用函数外部的变量,而函数外部的不可以用函数内部的变量(可以用闭包实现效果,随后总结)。

(function(){ var hei = 456;})(); 为函数自执行函数;有三种:
1) (function(){})();
2) (function(){}());
3) !function(){}();

2. 变量的提升:

var a = 1;
var b = 100;
function z(){
console.log(b); //100 //为什么b没有输出undefined ,这是因为后面没有var b = 99; 而是 b = 99;所以没有提升,他是一个全局变量。函数外也可以用。
console.log(a); //undefined
var a = 10; //所谓提升,就是将var a; 提升到函数体的第一句。就导致了 第二句输出undefined
console.log(a); //10
a = 4;
b = 99; // 如果变成var b = 99;函数外就不能用了 外面的输出就变成了 100. 前面的输出就变成了undefined,因为变量提升。
console.log(a); //4
console.log(b); //99
}
z();
console.log(b); //99
if(false){
var i = 10;
}
console.log(i); //为什是undefined ,也是变量提升。

3.函数提升

首先要明确两点:

<1> 只有函数声明才会进行函数提升

<2> 函数提升会将函数体一起提升上去,这点与变量提升有所不同

下面来证明函数表达式不能进行函数提升:

~function() {
alert(typeof next); // undefined
~function next() {
alert(typeof next); // function
}()
}()
函数前面加个~的目的是将函数声明变成函数表达式,实际上也可以加其它运算符,比如+,-,!等,总之这个函数声明被变成了函数表达式。
从打印结果来看第一个alert出的是undefined,说明next根本没有发生函数提升。

下面来接着验证:

a();// 123
var a = function(){
console.log(321);
}
a();// 321
function a(){
console.log(123);
}
从结果可以看出,先打印出来的反而是放在后面的a(),上面代码的等价表示如下: var a = function a(){
console.log(123);
}
a();
a = function(){
console.log(321);
}
a(); 都可以证明表达式不提升,而函数提升。 4.那么如果当变量提升与函数提升同时发生的时候,哪个的优先级更高呢?我们来做个实验:
console.log(ggg); // function ggg(){}
var ggg = 222;
function ggg(){};
console.log(ggg); // 222
console.log(ggg); // function ggg(){}
function ggg(){};
var ggg = 111;
console.log(ggg); //111 function ggg(){};
var ggg;
console.log(ggg); // function ggg(){}

由对上述代码的分析:可以总结出如下规律:(大神博客的总结,看了之后果然清楚了很多)

1)变量声明提升变量申明在进入执行上下文就完成了。

只要变量在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;

2)函数声明提升执行代码之前会先读取函数声明,意味着可以把函数申明放在调用它的语句后面。

只要函数在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;

3)变量or函数声明函数声明会覆盖变量声明,但不会覆盖变量赋值。

同一个名称标识a,即有变量声明var a,又有函数声明function a() {},不管二者声明的顺序,函数声明会覆盖变量声明,也就是说,此时a的值是声明的函数function a() {}。注意:如果在变量声明的同时初始化a,或是之后对a进行赋值,此时a的值变量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a); //1


**********************************************
接下来会有些 头疼 想了好长好长时间 /(ㄒoㄒ)/~~ var zzz = 222;
function zzz(){
  console.log(111);
}
console.log(zzz); // 111
**********************************************
var zzz;
function zzz(){
  console.log(111);
}
console.log(zzz); // function zzz(){console.log(111);}
console.log(zzz()); //111 , undefined
************************************************
B = 100;
function B(){
B = 2;
console.log(B);
}
B(); // B is not a function 由于函数提升,所以带着函数体在 B = 100;之前所以B是一个变量,不是函数
************************************************
B = 100;
var B = function(){
B = 2;
console.log(B);
}
B(); //2 由于表达式不提升,所以输出B = 2; 然后我好奇为什么B不输出自己本身的函数,所以把B = 2;改成了 x = 2;然后输出了 function(){ x = 2; console.log(B);}
****************************************************
在大神的博客上看到的小习题:
var a = 1; 
function b() {
console.log(a);
a = 10; 
function a() {} 

b();// ?
console.log(a);// ?
我的答案:   undefined  ,1
运行后的结果: function a(){} ,1 //我的天啊 ,又忘记考虑b函数里a函数的提升了并且覆盖了没赋值的a a = 10;
(function a(){
a = 1;
console.log(a);// ?
})(); 我的答案: 1
运行后结果: function a(){ a = 1; console.log(a);} // 这里自执行函数,首先他是一个表达式,他不会提升,同时声明函数和变量,以函数为主,返回函数
******************************************************
function a(i) { 
console.log(i);// ?
var i = 1; 
console.log(i);// ?
}; 
a(10); 
我的答案: 10 , 1
运行后结果: 10 , 1 呵呵呵 我终于对一个了。

js 函数和变量的提升的更多相关文章

  1. JS函数和变量

    JS函数和变量  函数: 函数是由事件或者当它被调用时执行的可重复使用的代码块. 是一个独立的代码块,实现特定功能模块. 函数他不进行调用触发的话,不会自己主动执行. 像ATM机一样,不去取钱的话不会 ...

  2. js函数和变量的执行顺序【易错】

    js函数和变量的声明与执行顺序 一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); // ...

  3. js函数、变量提升(hoisting)

    其实我只是想复习下变量提升的,然后看到了函数提升,然后再看到了函数声明.函数表达式. 有必要怀着敬仰之心提及园子里的TOM大叔的解密命名函数表达式,不愧是大叔,好好地脑补了下基础知识. 在ECMASc ...

  4. js函数和变量的声明与执行顺序

    一.函数执行顺序 1.正常顺序 function f(){ alert(2); } f(); //alert 2 所有浏览器都能测试通过. 2.倒序调用 f(); //alert 2 function ...

  5. JS函数和变量名称冲突

    在JS中如果函数名与变量名冲突,JS是怎么执行的? <script> console.log(sum);//function sum(){} function sum(){} var su ...

  6. [转]js 判断js函数、变量是否存在

    本文转自:http://blog.csdn.net/liang4571231/article/details/4042519 在进行js编程时,总会出现可能一些函数或者变量未定义而被引用,导致报错的情 ...

  7. js函数与变量同名

    console.log(a); var a = 3; function a(){} 输出的结果是:[Function: a] 注意一下几点就能知道原因了! 1)函数声明会置顶2)变量声明也会置顶3)函 ...

  8. js 判断js函数、变量是否存在 JS保存和删除cookie操作,判断cookie是否存在的方法

    //是否存在指定函数 function isExitsFunction(funcName) {    try {        if (typeof(eval(funcName)) == " ...

  9. JS函数、变量作用域

    函数参数 函数的()中指定一个或多个形参(形式参数),多个形参之间用,号隔开,声明形参相当于在函数内部声明了对应的变量,但不赋值.在调用时在()中指定实参  调用时解析器不会检查实参类型.数量,实参可 ...

随机推荐

  1. Reapter合并行

    html文件: <asp:Repeater ID="rptEmployee" runat="server"> <HeaderTemplate& ...

  2. 从零开始HTML(二 2016/9/20)

    1.布局 ① 使用 <div> 元素的 HTML 布局,<div> 元素常用作布局工具,因为能够轻松地通过 CSS 对其进行定位. <!DOCTYPE html> ...

  3. hdu 5358 First One

    题目链接:hdu 5358 思路不难理解,就是个尺取法而已,floor(log2X) + 1 就是求 X 的二进制表示的位数,对于题目来说这个值最多只是 30+,从这里入手开始枚举,运用尺取法可以达到 ...

  4. Spring事务管理只对出现运行期异常进行回滚

    原文:http://blog.csdn.net/abc19900828/article/details/39497631 使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择 ...

  5. postgresql中执行计划

    1.Explain explain select * from tablename; 2.explain输出josn格式 explain (format json) select * from tab ...

  6. 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)

    学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...

  7. JavaScript的sleep延时函数

    JavaScript没有像Java的sleep延时函数,所以记录JavaScript的sleep延时函数 function sleep(milliSeconds) { var startTime = ...

  8. HTML基本知识

    HTML语言:超文本标记语言 基本结构: <html><head><body> <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  9. qml 封装技巧-利用数据来进行适配

    Text属于用的频率比较高而且需要定义的地方又比较多的地方,看一下如下的把Text封装成Label进行使用. 使用的例子: Label { id: titleLabel anchors { left: ...

  10. js浏览器检测

    1.判断浏览器类型 if navigator.userAgent.indexOf(”MSIE”)>0) {} //判断是否IE浏览器 if(isFirefox=navigator.userAge ...