`
sfh
  • 浏览: 4533 次
  • 性别: 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函数式编程

    JavaScript函数式编程是一种编程范式,它强调将计算视为数据处理的过程,并且重视函数作为第一类公民,即函数可以作为变量赋值、作为参数传递、作为返回值返回。这种编程风格在JavaScript中尤其常见,因为它提供了...

    实例讲解JavaScript预编译流程

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

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

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

    《李炎恢Javascript笔记》+源码

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

    javascript笔记

    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函数,从而在运行时只需传递数据即可快速生成动态页面。 二、工作原理 预编译工具通常接受一种特殊的模板语法,如Mustache、 Handlebars 或 ...

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

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

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

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

    菜鸟的Javascript笔记.rar

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

    浅谈js中的变量名和函数名重名

    在JavaScript编程语言中,变量名和函数名重名是一个常见的问题,这主要涉及到JavaScript的预解析(hoisting)机制和作用域规则。本文将深入探讨这个问题,并解释为什么在某些情况下,代码可能会出现“is not a ...

    javaScript学习笔记总结.docx

    JavaScript与Java虽然名字相似,但两者是完全不同的语言。Java是一种静态类型的、面向对象的编程语言,而JavaScript则是动态类型的、基于原型的脚本语言。 JavaScript的主要作用包括: 1. 动态修改HTML和CSS:通过...

    javascript笔记之匿名函数和闭包

    JavaScript中的匿名函数和闭包是两个非常重要的概念,它们在函数式编程和模块化开发中起着关键作用。 首先,让我们来理解匿名函数。匿名函数,顾名思义,是没有名称的函数。在JavaScript中,我们可以直接定义一个不...

    JavaScript-学习笔记.docx

    这篇学习笔记主要涉及了JavaScript的基础概念和一些高级特性,包括预编译、作用域、函数、对象原型、原型链、函数调用方式(如call、apply)、继承模式、对象克隆、数组操作、自定义类型判断以及错误处理机制。...

    JavaScript笔记.md

    JavaScript笔记

Global site tag (gtag.js) - Google Analytics