`
sfh
  • 浏览: 4619 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Javascript笔记之 预编译与重名函数

阅读更多

Javascript 果然存在所谓的预编译,例证:

 

1.变量预编译:

 

var test_a = 'a test';

function test1(){
        alert(test_a);
}

function test2(){
        alert(test_a);
        var test_a = "a test in function";
        alert(test_a);
}

test1();
test2();

 

 

结果 :[a test] [undefined] [a test in function];

 

个人理解(也参照了网上的很多解释):

浏览器在执行一个作用域内的javascript代码时,会预先将以var定义的变量标记为已定义(相当于在该作用域内注册),并“赋初值:undefined”;

执行代码时遇到变量引用,会先定位作用域内已经定义的变量,若找到则使用该变量(在test2中test_a已经被预定义了,所以可以找到,则会输出其值——undefined),若找不到则向父作用域定位变量,一直到window作用域,假如一直到最后都未找到该变量,那么程序到此会报错,说“变量未定义”;

 

可以再试试下面的代码,以便加深理解:

 

 

function test1(){
        alert(test_a);
	test_a = "a test in function test1";
	alert(test_a);
}

function test2(){
        alert(test_a);
        var test_a = "a test in function";
        alert(test_a);
}
test1();
test2();
alert(test_a);
var test_a = 'a test';
// test_a = 'a test'; 试着去掉该句注释,然后将上一句注释掉看看会怎么样

 

 

 

2.函数预编译:

 

 

myfunc();
function myfunc() {
	alert("myfunc for the first time");
	return false;
}
myfunc();

myfunc = function() {
	alert("myfunc for the second time");
	return false;
}
myfunc();

function myfunc() {
	alert("myfunc for the third time");
	return false;
}
myfunc();
alert(myfunc);

 

 结果

[myfunc for the third time]

[myfunc for the third time]

[myfunc for the second time]

[myfunc for the second time]

[function () { alert("myfunc for the second time"); return false; }]

 

个人理解(也参照了网上的很多解释):

 

暂时只讨论一个作用域内平级的函数块(不同作用域也不会产生重名)。浏览器在执行一个作用域内代码时,也会预先对function fun(){}形式的函数进行“预编译”,并且对于重名的函数,只保留其最后一次的定义的代码逻辑。执行过程中将不再对function fun(){}形式定义的同名函数的逻辑进行重写,但是遇到fun=function(){}这样形式的重名函数,浏览器又会重写fun函数中的代码逻辑(真是怪哉 )。

并且,和变量一样,函数形如var func = function(){}的,在预编译中也会被“注册”到本作用域的已定义变量中,并且初值赋为“undefined”,所以这样定义的函数不能在赋值之前这样执行func(),否则会报错:"func is not a function",因为正式赋值之前浏览器就将它看做一个普通变量(初值为undefined)

 

分享到:
评论
1 楼 02221021 2009-06-03  
好文章 学习了

相关推荐

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    狂神说系列 JavaScript笔记

    【狂神说系列 JavaScript笔记】是一份全面且深入的JavaScript学习资源,旨在帮助开发者和初学者深入理解这门广泛应用于Web开发的脚本语言。这份笔记涵盖了JavaScript的基础语法、核心概念以及高级特性,旨在构建一个...

    网站的预编译

    5. **版本控制**:预编译有利于版本控制,因为预编译后的文件与源码分开管理,可以更容易地比较和回滚不同版本的静态资源。 在预编译过程中,通常会涉及到以下技术: - **模板引擎**:例如Jinja2、ERB或Razor,...

    javascript指南和函数式编程

    《Effective JavaScript(中文版).pdf》这本书是JavaScript编程的经典之作,它包含了68个具体的实践建议,涵盖了语言的基础到高级特性。每个建议都通过实例来解释,旨在提高代码的质量和效率。书中的知识点包括但不...

    JavaScript函数式编程.pdf

    不过,由于【标题】中提供了文档的名称——"JavaScript函数式编程.pdf",我可以根据这个名称扩展出关于JavaScript函数式编程的知识点。 JavaScript函数式编程的知识点非常丰富,涉及很多方面的内容,下面将详细介绍...

    实例讲解JavaScript预编译流程

    预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数 ; 2-JS预编译什么时候发生 预编译到底什么时候发生? 误以为预编译仅仅发生在script内代码块执行前 这倒并没有错 预编译确确实实在script代码内执行...

    JavaScript学习笔记_js常用函数封装_js包.zip

    `gulp`是一个自动化任务管理工具,常用于JavaScript项目的构建流程,包括编译SCSS(Sass预处理器语言)成CSS、压缩JavaScript代码、合并文件等。通过配置`gulpfile.js`,可以实现自动化工作流,提高开发效率。 `...

    李立超JavaScript基础篇笔记

    尽管JavaScript与ECMAScript在概念上有所区别,但通常情况下,人们将它们视为同义词,因为ECMAScript是JavaScript的标准化版本,由各大厂商如Mozilla、Microsoft等遵循并实现。 JavaScript的特点包括: 1. 解释型...

    《李炎恢Javascript笔记》+源码

    《李炎恢Javascript笔记》是一本深入浅出的JavaScript学习资料,它涵盖了JavaScript的基础到实践应用的诸多方面。这本书的特点是将复杂的编程概念分解为易于理解的小知识点,并且提供了源码示例,使得读者能够更好地...

    JavaScript之函数(ppt)

    JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数...

    javascript笔记之匿名函数和闭包.docx

    在JavaScript中,匿名函数是一种没有名称的函数,通常作为参数传递或者用于立即执行。在上述文档中,我们看到几种不同的匿名函数使用方式: 1. **匿名函数自执行**:`(function(){})()`,这种写法会立即执行该匿名...

    菜鸟的Javascript笔记.rar

    这个菜鸟的笔记里面没有谈到JavaScript中的对象,比如说时间对象和字符串对象,这些内容可以在“菜鸟的JavaScript对象笔记”中找到。不过因为小菜鸟个人认为HTML DOM比其它的JavaScript对象更常用一些(不过这可不...

    bootstrap-3.3.7 预编译版下载

    8. **JavaScript插件API**:预编译版中的JavaScript插件可以通过jQuery API进行交互和自定义,例如,通过调用$('#myModal').modal('show')来显示一个模态框。 9. **自定义构建**:虽然预编译版不包含在内,但...

    简单易用的前端模板预编译工具

    通过预编译,开发者可以在开发阶段就处理好模板,生成静态的JavaScript函数,从而在运行时只需传递数据即可快速生成动态页面。 二、工作原理 预编译工具通常接受一种特殊的模板语法,如Mustache、 Handlebars 或 ...

    html+css+javascript笔记完整版

    JavaScript还涉及事件处理,异步编程如回调函数和Promise,以及ES6引入的新特性,如箭头函数、模板字符串和解构赋值。 **前端学习路径** 作为前端学习的宝典,这份笔记可能还会涵盖一些额外的主题,比如浏览器的...

    javascript学习笔记整理知识点整理

    十、JavaScript与Node.js JavaScript不仅用于浏览器环境,还可以通过Node.js在服务器端运行。Node.js提供了丰富的服务器开发API,支持非阻塞I/O,适合构建高性能的网络应用。 这份学习笔记将详细解释以上各个知识点...

    JavaScript笔记第一章—课程准备.pdf

    JavaScript提供了多种输入输出工具,用于与用户进行交互。`prompt()`函数用于显示一个对话框,提示用户进行输入,可以有两个参数,第一个是对话框中显示的纯文本,第二个是默认的输入文本。`alert()`函数用于弹出一...

    javascript编译工具

    JavaScript方法是预定义的函数,如`Array.prototype.forEach()`用于遍历数组,`String.prototype.trim()`用于去除字符串两端的空白字符等。理解并熟练使用这些内置方法能够极大地提升代码的效率和可读性。 在...

    javascript 笔记 适合初学者 jquery chm 资料

    JavaScript是一种广泛应用于网页和网络应用的脚本语言,它主要负责网页的动态交互,使得用户在与网页交互时能够得到即时反馈。对于初学者来说,理解JavaScript的基本语法、数据类型、控制结构、函数以及事件处理是...

    JavaScript学习笔记,javascript基础知识,基础语法整理.pdf

    * 函数是JavaScript中的一种基本结构单元 * 函数可以封装一组语句,实现功能的复用 * 函数可以传递参数,实现参数的传递 * 函数可以返回值,实现结果的返回 三、 JavaScript 中的对象 * 对象是JavaScript中的一种...

Global site tag (gtag.js) - Google Analytics