javascript两种function的定义介绍及区别说明

一般情况下两者的调用结果是一样的,但是还是有区别的。
第一种方式:


代码如下:

function a(){
alert('old');
}
var b=a;
function a(){
b();
alert('new');
}
a();//浏览器就会出现内存溢出的情况

第二种方式:


代码如下:

function a(){
alert('old');
}
var b=a;
var a=function(){
b();
alert('new');
}
a();//浏览器就会按顺序alert出‘old'和‘new'

这里就可以很明显区分两个方式的区别了。定义的顺序不同。
第一种,刚开始其实没有重新定义 a 这个function 而在里面执行了其本身。
第二种方式, a = function () 这里没有执行到 function 里面的代码 a 已经被重新定义了。所以这里的重定义是有效的
补充1:


代码如下:

function a(){
alert('old');
}
var b=a;
function a(){
b();
alert('new');
}

编译时: 首先a被定义为alert("old"), 接着又被定义成b();alert("new");
运行时: b = function a(){b();alert("new");}, 此时b和a一样, 函数体中直接调用b, 无论从a调用还是从b调用结果都一样, 产生堆栈溢出
另一方面


代码如下:

function a(){
alert('old');
}
var b=a;
var a=function(){
b();
alert('new');
}

编译时: a被定义为alert("old")
运行时: b=function a(){alert("old")}; a=function(){b();alert("new")}; 此时b的函数体中不包括ab中任何一个, a只调用b... 无论怎样都不会产生堆栈溢出...
补充2:
一般来说,都会用第一种的写法来避免代码污染,但如果你需要保留原function,就要用第二种写法,反正两种方法都是符合w3c的。
事实上第一种写法是后来才有的,这种写法是经过优化的。

(0)

相关推荐

  • JavaScript的Function详细

    Function (Built-in Object) Function (內置對象) Function is the object from which JavaScript functions are derived. Functions are first-class data types in JavaScript, so they may be assigned to variables and passed to functions as you would any other pie

  • javascript Object与Function使用

    如今的JavaScript再也不是以前被当做玩具的在网页上运行的花哨的脚本了.JavaScript已经逐渐标准化,作为一门真正的编程语言广泛地应用在Web开发上.因此,越来越多的人开始重新认识这门脚本语言,并在不断地探索关于JavaScript核心思想和实现原理,过程中遇到了一些非常混淆的问题.本文着重解释一个比较常见但是非常容易使开发人员或者是初学JavaScript的人非常混淆的问题,那就是两个核心构造函数Object和Function,他们之间到底有什么关系?为何instanceof运算符

  • Javascript 使用function定义构造函数

    Javascript中创建对象的语法是在new运算符的后面跟着一个函数的调用.如 复制代码 代码如下: var obj = new Object(); var date = new Date(); 运算符new首先创建一个新的没有任何属性的对象,然后调用该函数,把新的对象作为this关键字的值传递. 复制代码 代码如下: var date = new Date()的伪代码的实现就是 var obj = {}; var date = Date.call(obj); 构造函数的作用就是初始化一个新创

  • javascript中Function类型详解

    Function 类型 function类型,毋庸置疑是js中相当重要的一个玩意. 1.这玩意首先是一个对象,也就是说它是一个引用类型.陈述:一听说是对象,是不是很有一种它的基类是object对象错觉感,No, 它和object是独立的2个东西.当你typeof function 时,返回的是 funciton 并非 object 2.每个函数都是 Function 对象的一个实例,它与其他引用对象一样具有属性和方法.由于它是对象所以函数名是指向函数对象的指针 关于函数的声明的语法支持: <sc

  • JavaScript 匿名函数(anonymous function)与闭包(closure)

    引入 匿名函数 闭包 变量作用域 函数外部访问函数内部的局部变量 用闭包实现私有成员 引入 闭包是用匿名函数来实现.闭包就是一个受到保护的变量空间,由内嵌函数生成."保护变量"的思想在几乎所有的编程语言中都能看到. 先看下 JavaScript 作用域: JavaScript 具有函数级的作用域.这意味着,不能在函数外部访问定义在函数内部的变量. JavaScript 的作用域又是词法性质的(lexically scoped).这意味着,函数运行在定义它的作用域中,而不是在调用它的作用

  • eval(function(p,a,c,k,e,d)系列解密javascript程序

    步骤:1.新建html页面,把以下代码考进去,运行. 2.把加密的代码粘进文本域,点击解密,OK! 核心代码: 复制代码 代码如下: <script> a=62; function encode() { var code = document.getElementById('code').value; code = code.replace(/[\r\n]+/g, ''); code = code.replace(/'/g, "\\'"); var tmp = code.m

  • javascript学习笔记(四)function函数部分

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. Jscript 支持两种函数:一类是语言内部的函数(如eval() ),另一类是自己创建的. 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量. 函数的调用方式 1.普通调用:functionName(实际参数...) 2.通过指向函数的变量去调用: var  myVar

  • javascript 正则替换 replace(regExp, function)用法

    复制代码 代码如下: function fn() { for(var i = 0;i < arguments.length;i++){ alert("第"+(i+1)+"个参数的值:"+arguments[i]); } } var str = '<div id="{wo}" >{ni}</div>'; str.replace(/\{([a-z]+)\}/ig, fn); 根据多次测试由输出结果可以得出fn中: 第一个

  • JavaScript Function函数类型介绍

    // 在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例;而且都与其他引用类型一样具有属性和方法; // 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针; 一 函数的声明方式 1.函数声明方式 function box(num1,num2){ return num1+num2; } 2.函数表达式定义函数 var box = function(num1,num2){ // 通过变量box即可引用函数; return num1+num2; };

  • javascript两种function的定义介绍及区别说明

    一般情况下两者的调用结果是一样的,但是还是有区别的. 第一种方式: 复制代码 代码如下: function a(){ alert('old'); } var b=a; function a(){ b(); alert('new'); } a();//浏览器就会出现内存溢出的情况 第二种方式: 复制代码 代码如下: function a(){ alert('old'); } var b=a; var a=function(){ b(); alert('new'); } a();//浏览器就会按顺序

  • 浅谈javascript:两种注释,声明变量,定义函数

    JavaScript:单行注释用//呵呵呵呵:多行注释用/*hdhdhdh*/ javascript中区别大小写,定义变量使用关键字var,语法如下:var 变量名,其中变量从编程角度讲,变量是用于存储某种/某些数值的存储器. javascript函数调用: 以上就是小编为大家带来的浅谈javascript:两种注释,声明变量,定义函数全部内容了,希望大家多多支持我们~

  • JavaScript三种绑定事件方式及相互之间的区别分析

    本文实例讲述了JavaScript三种绑定事件方式及相互之间的区别.分享给大家供大家参考,具体如下: JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> //直接在DOM里绑定事件 <script> function clickone(){ alert("hello"); } </script> 2. <div i

  • JavaScript几种常见循环遍历使用和区别

    目录 前言 1.“for” 循环:它是最常使用的循环形式 2."for..in" 循环:为了遍历一个对象的所有键(key) 3.for..of:不能获取当前元素的索引,只是获取元素值 4.forEach:允许为数组的每个元素都运行一个函数 5.Map and Set(映射和集合) 前言 在javascript语言中经常需要使用循环语法去获取数据中的一些值,例如,我们需要将列表中的商品逐个输出,或者运行相同的代码将数字 1 到 10 逐个输出.方法也比较多,该篇将讲解常见的循环遍历的使用

  • Spring中的两种代理JDK和CGLIB的区别浅谈

    一.原理区别: Java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用

  • Mybatis两种不同批量插入方式的区别

    目录 前言 测试 拼接 sql batch插入 数据对比 总结 前言 本文使用 Mybatis 进行批量插入,比较两种不同的插入方式的区别. 测试 批量插入注意事项: 1.连接数据库时添加参数 allowMultiQueries=true,支持多语句执行,批处理 2.数据库是否支持大量数据写入,设置 max_allowed_packet参数保证批次提交的数据量 拼接 sql public void batchDemo() { long start = System.currentTimeMill

  • 对pandas中两种数据类型Series和DataFrame的区别详解

    1. Series相当于数组numpy.array类似 s1=pd.Series([1,2,4,6,7,2]) s2=pd.Series([4,3,1,57,8],index=['a','b','c','d','e']) print s2 obj1=s2.values # print obj1 obj2=s2.index # print obj2 # print s2[s2>4] # print s2['b'] 1.Series 它是有索引,如果我们未指定索引,则是以数字自动生成. 下面是一些例

  • JavaScript两种跨域技术全面介绍

    这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进行多iframe或多窗口编程.以及Ajax编程时显得尤为重要.根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在google.com域名下的页面内容:甚至不同的子域名之间的页面也不能通过JavaScript代码互相访问.对于Ajax的影响在于,通过XMLHttpRequest实现的Ajax请

  • javascript 两种声明函数的方式的分析

    javascript 声明函数 JavaScript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; /*方式二*/ function FUNCTION_NAME () { /* FUNCTION_BODY */}; 区别一 方式一的声明方式是先声明后使用 方式二的声明方式可以先调用,后声明 /*方式一: *

  • JavaScript两种计时器的实例讲解

    通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.我们称之为计时事件.提供了两种计时器的方法如下: window.setInterval(): 这个方法就是在一个周期内反复执行一直到窗口关闭或者 clearInterval() window.setTimeout(); 延迟执行内容 setInterval()的使用方法: setInterval(code,millisec); code:可以是方法名,如果是方法不要加小括号.同时也可以

随机推荐