js的预编译机制

1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错)
2.js的预编辑:【对定义式函数】直接创建为作用域上的函数变量,并将其值初始化为定义的函数代码逻辑,也就是为其建立了可调用的函数变量。
3.js的预编辑:【对var定义的变量】 会在开始先全部找出来,并且将初始值设为undefined
4.【对上面代码的解释】:第一个yourname是undefined:在js开始解析时获得了第一行的yourname声明和函数内部的yourname声明,也就是说在函数内部的局部变量里yourname是被声明过的,然后他们被赋予undefined(等待进一步赋值),然而在函数内部时调用在前赋值在后,所以显示的是undefined;
5.最后一行仍然是“李战”:js倾向于先在当前作用域中找函数或变量,如果没有的话再到上层去找,以此类推
最后贴几个很好的例子:
alert(testNum);
alert('ok');
testNum = 2;
//testNum未声明,执行报错。
alert(testNum);
alert('ok');
var testNum = 2;
//弹出undefined和ok。预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined。
testFunc();
function testFunc() {}
alert('ok');
//弹出ok。预编译的时候,解析了定义式函数语句function testFunc() {},顺利执行。
testFunc();
var testFunc = function() {};
alert('ok');
//testFunc不是函数,执行报错。预编译的时候,声明了变量testFunc = undefined;执行到testFunc()时,testFunc还等于undefined,不是函数,所以执行testFunc()会报错。 <\script type="text/javascript">
testFunc();
alert('first block');
<!--\script-->
<\script type="text/javascript">
alert('second block');
<!--\script-->
//弹出second block。因为JS是一段一段执行的,第一段执行到testFunc()的时候报错,整个第一段都不会再执行,第二段正常执行。
js的预编译机制的更多相关文章
- JS的预编译和执行顺序 详析
原文:JS的预编译和执行顺序 详析 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 复制代码 代码一 <ht ...
- js 变量、函数提升 与js的预编译有关
参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = ...
- 如何预防SQL注入?预编译机制
1.预编译机制(一次编译多次执行,防止sql注入) 2.预编译机制
- JS的预编译和执行顺序 详析(及全局与局部变量)
最近在复习javascript的事件处理时发现了一个问题,于是总结一下:javascript的预编译和执行顺序的问题: <html> <head> <title> ...
- C++封装常用对象和对头文件以及预编译机制的探索
在C++实际开发中,难免会使用到一些你极为常用的算法(比如笔者经常使用的多线程技术),实现这些算法的类或是全局函数或是命名空间等等经常都要被使用多次,你会有哪些办法来使用呢?笔者有4个办法. 第一个方 ...
- JS笔记--------预编译,闭包和作用域
(一)JS预编译四部曲: 1,创建AO对象. 2,找形参和变量声明,将变量和新参名作为AO属性名,值为undefined. 3,将实参值和形参值统一. 4,在函数体里找函数声明,值赋给函数体. (二) ...
- JS 的预编译和执行顺序
脚本执行js引擎做的工作: 语法分析 预编译 解释执行
- js的预编译
JavaScript不会完全按照代码的顺序执行,在执行之前会对定义的函数和变量先来一边所谓的预编译处理. 先来说下对变量的预处理: console.log(a) //undefined var a = ...
- js函数预编译和声明语句被提升问题小结
<!DOCTYPE html><html><head></head><body><script>//-------------- ...
随机推荐
- Linux下svn提交文件后自动同步更新到网站目录
有时,对于多文件需要上传到服务器的时候将会很麻烦,但是如果使用svn的钩子脚本就容易实现本地提交svn后,自动同步代码文件到远程服务器的网站目录下,而不必手动上传了. 首先,在网站目录下checkou ...
- 通过两根RS232连接两台电脑
把RS232的有5脚那边放下面,最左边是GND,第二三是TXD和RXD,两个RS232反接,然后两个usb连接电脑就可以通信了
- SqlSever基础 where 与 group by组合起来 处理数据
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- c#中struct和class的区别 详细[转]
转自:http://blog.csdn.net/justlovepro/archive/2007/11/02/1863734.aspx 有这么几点不同: 1.struct 是值类型,class是对象类 ...
- vs2012 提示 未能正确加载 "Visual C++ Language Manager Package" 包 的解决办法
1.点击vs2012菜单栏 工具-> Visual Studio 命令提示 打开命令窗口 2.输入命令 "devenv /Setup" 3.重新打开vs2012
- [CF738B]Spotlights(前缀和,模拟)
题目链接:http://codeforces.com/contest/738/problem/B 题意:问多少个0的方向,使得方向上至少有一个1. 四个方向统计一遍前缀和,向上向左正着记,向下向右倒着 ...
- 11.Events
1.A type that defines an event member allows the type (or instances of the type) to notify other obj ...
- HDU 5929 Basic Data Structure 模拟
Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- loutsScript 常用代码
1.FTSearch搜索: Set dc=db.Ftsearch("name",0) '0位置为最大的查询数,0为所有匹配的文件 FTSearch必须创建数据库索引 Set doc ...
- Build Up Your Own Lightweight Workspace
写一段简单的批处理(.bat)放在自己建的workspace下. @set path=C:/Program Files/Java/jdk1.8.0_101/bin;%PATH%; //jdk的路径 @ ...