1、预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义
var num = 12;
声明(declare): var num; -->声明的时候没有赋值,我们的默认值是undefined
定义(defined): num=12; 2、带var和带function的预解释不一样:
var:在预解释的时候,只声明未定义(只有代码执行的时候才会完成赋值定义)
function:在预解释的时候,声明和定义一起完成了(当代码在执行到定义的那一块的时候就不用管了) 全局作用域下的预解释:var num; fn=xxxfff000; (fn函数里面的此时都还是一堆字符串呢,所以全局预解释的时候,是不管函数里面的-->只有当函数执行,里面的字符串变为代码的时候才会进行里面的预解释)
console.log(num);-->undefined
var num = 12;-->num=12
function fn() {21~25都是fn定义的部分,但是在预解释的时候已经完成了,所以我们直接的跳过即可
console.log(num);-->undefned
var num = 13;
console.log(num);-->13
}
fn();
console.log(num);-->12 3、带var和不带var的区别?
console.log(num);-->undefined
var num = 12;
console.log(num);-->12 console.log(num);-->Uncaught ReferenceError: num is not defined 错误就是变量不存在 (JS中的错误机制:上面的代码执行报错(浏览器的异常信息),下面的代码都不在执行了)
num = 12;
console.log(num); 以下的区别只对全局作用域下的全局变量起到作用
var num=12; -->一方面是定义了一个全局的变量,另外一方面也相当于给window增加了一个属性num
num=12; -->相当于给window增加了一个属性num -->window.num=12;
var num = 12;
console.log(num);-->12 num = 12;
console.log(num);-->12 4、关于私有作用域中的变量
console.log(num);-->undefined
var num = 12;
function fn() {
console.log(num);-->输出全局作用域下num变量的值12
num = 13;-->把全局下的num变量的值修改为13
console.log(num);-->输出全局作用域下num变量的值13
}
fn();
console.log(num);-->输出全局作用域下num变量的值13 function fn() {
console.log(num);-->Uncaught ReferenceError: num is not defined
num = 13;
console.log(num);
}
fn();
console.log(num); function fn() {
num = 13;-->num不是私有的变量,则向上一级查找,发现全局也没有,在window下增加了一个num的属性名,属性值是13
console.log(num);-->window.num 13
}
fn();
console.log(num);-->window.num 13 总结:
1、预解释只发生在当前的作用域下
2、如何区分私有的变量?
在私有作用域中声明的变量(函数)、形参,有且只有这两种情况下是私有的变量 -->只有在私有作用域中带var的或者形参才是私有的变量
在一个函数中我么遇到一个变量,按照上述的规律看是否为私有的,如果是私有的,那么当前函数体中此变量和外面没有任何的关系,是不同的变量
3、在一个私有作用域中发现一个非私有的变量,我们往它的上一级作用域进行查找,如果是上级的,则用上级的变量,如果上级也没有,则继续向上查找...一直找到window为止
4、函数执行形成一个私有的作用域,保护里面私有的变量不受外界的干扰,我们把函数的这种保护机制-->"闭包"

课程笔记:——Javascript 中的预解释1的更多相关文章

  1. 课程笔记:——javascript中的预解释2

    in:检测某一个属性是否属于这个对象(既可以检测私有的属性,也可以检测公有的属性) --> attr in obj 1.不管条件是否成立,在预解释的时候,判断体中的带var和function的都 ...

  2. 第112天:javascript中函数预解析和执行阶段

    关于javascript中的函数:  1.预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前  2.执行 :从上到下执行,但有例外(setTimeout,setInterval,aja ...

  3. js中的预解释

    在js中,带var 和function关键字的需要预解释: 那什么是预解释?就是在js代码执行之前,先申明好带有var 关键字和带有function关键字的变量,在内存里先安排好.但是带有var关键字 ...

  4. js学习笔记----JavaScript中DOM扩展的那些事

    什么都不说,先上总结的图~   Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...

  5. javascript中的预编译问题

    Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题. 示例: 这是一段js中普通的函数调用代码 <script>1.    // ...

  6. 读书笔记-JavaScript中的全局对象

    对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用.这个JavaScript自身提供的全局对象的功能包括: 1.全局对象拥有一些常用的属性 ...

  7. codecademy课程笔记——JavaScript Promise

      Promise是一种表示异步操作最终的结果的对象,一个Promise对象有三种状态 Pending: 初始状态 ,操作还未完成 Fullfilled:操作成功完成,且这个promise现在有一个r ...

  8. 《深入理解ES6》笔记—— JavaScript中的类class(9)

    ES5中的近类结构 ES5以及之前的版本,没有类的概念,但是聪明的JavaScript开发者,为了实现面向对象,创建了特殊的近类结构. ES5中创建类的方法:新建一个构造函数,定义一个方法并且赋值给构 ...

  9. JS开发备忘笔记-- Javascript中document.execCommand()的用法

    document.execCommand()方法处理Html数据时常用语法格式如下:document.execCommand(sCommand[,交互方式, 动态参数]) 其中:sCommand为指令 ...

随机推荐

  1. String转double或者float会有精度丢失的问题

    float [] value=new float[5]; value[0]=Float.parseFloat(rs.getString(1)); value[1]=Float.parseFloat(r ...

  2. ubuntu 14.04 java开发环境搭建 jdk 以及 inteliJ IDEA安装

    1.安装包 jdk1.7.0_71 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-188026 ...

  3. Error:No suitable device found: no device found for connection "System eth0"

    环境描述: Vmware 故障说明: 在克隆几台虚拟机,发现启动后不能配置IP地址等信息,使用linux命令: “ifup eth0”也不能激活网卡, 而在使用"service networ ...

  4. 慕课网__CSS__ Relative, absolute,

    同时又left, right  或者 top, bottom时 relative, 尽量少用,会出现层级覆盖, 或者单独使用, 避免层级嵌套, 或者覆盖 absolute具有包裹性, 和破坏性 包裹性 ...

  5. Selenium:元素等待的4种方法

    1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐示等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间.默认值是 ...

  6. guardian keytab生成不了

    vim /var/kerberos/krb5kdc/kadm5.acl 将*e改成* /etc/init.d/kadmin restart 重启kadmin

  7. phalcon: 多模块多表查找,多表sql

    那么多模块下,如何分页的,如果直接用->from(表名),报错找不到此类,此时要引用model类的全命名空间名称如下: $builder = $this->modelsManager-&g ...

  8. 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

    转载自脚本之家 http://www.jb51.net/article/51831.htm  作者:忙碌的松鼠 对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层, ...

  9. ios 常用字符串的操作

    //将NSData转化为NSString        NSString* str = [[NSString alloc] initWithData:response encoding:NSUTF8S ...

  10. MySQL学习记录--分组与聚集

    一.group by 子句 group by 字句可对数据进行分组. 以MySQL5.5的sakila数据库中的film数据表举例:查找出各个电影等级的电影总数 mysql>SELECT rat ...