(转)深入理解javascript的function
原文:http://www.cnblogs.com/sharpxiajun/archive/2011/09/16/2179323.html
javascript笔记:深入理解javascript的function
Function是javascript里最常用的一个概念,javascript里的function是最容易入手的一个功能,但它也是javascript最难理解最难掌握的一个概念。
一、我的第一个javascript代码
1 function test()
2 {
3 alert('Hello World!');
4 }
5 window.onload = test();//Hello World!
界面加载时候就会弹出写有“Hello World!”的对话框。我对function的第一印象就和java里面方法没啥区别了。但是当我看到这样的代码我就晕乎乎了。
1 function test(num) 2 { 3 return function() 4 { 5 if (num > 0) 6 { 7 return '正数'; 8 }else if (num < 0) 9 { 10 return '负数'; 11 }else{ 12 return '零'; 13 } 14 } 15 } 16 window.onload = alert(test(11)());//零
二、javascript里面定义函数的方法
- 1. 函数声明
- 2. 函数表达式
- 3. 使用Function构造函数
1 function sum(a,b)
2 {
3 return a+b;
4 }
5
6 alert(sum(10,20));//30
1 var sum = function(a,b) 2 { 3 return a+b; 4 }; 5 6 alert(sum(10,20));//30
1 var sum = new Function("a","b","return a+b");
2 alert(sum(10,20));//30
以上三种都可以定义一个函数目的。大多数javascript书籍里面不推荐使用第三种,原因第三种存在严重的性能问题,这种定义会解析两次代码,第一次是常规的解析这条语句,第二次要把函数里的字符串解析成实际的函数,但是它却传达了javascript的函数其实是对象(object),而函数名是指向对象的指针。
因此我觉得理解函数function的关键把它当作对象object。Javascript对象存储的方式:
Javascript数据是存在栈内存(stack)和堆内存(heap),堆内存存储javascript对象的具体内容,而栈内存存储对象的地址,下面的代码:
1 var ftn = function(){alert(‘hi’)};
ftn存储在栈内存,function(){alert(‘hi’)};存储在堆内存里面,ftn的记录的是function(){alert(‘hi’)};在堆内存的地址。因此下面的代码:
1 alert(ftn);// var ftn = function(){alert(‘hi’)};
弹出框显示的是function的全部定义。如果代码如下:
ftn()//hi
结果就是hi了。(一般执行函数,可以在函数名后面加上括号,传入需要传入的参数)。
三、javascript里面没有函数重载
1 function sum(num) 2 { 3 return num+10; 4 } 5 function sum(num) 6 { 7 return num+30; 8 } 9 alert(sum(10));//40
后面定义的方法会覆盖前面的方法,如果我们理解了“javascript的函数其实是对象(object),而函数名是指向对象的指针”,这个就很好理解了,上面的写法可以改写为:
1 var sum = function(num)
2 {
3 return num+10;
4 }
5 sum = function(num)
6 {
7 return num+30;
8 }
9 alert(sum(10));//40
四、函数声明和函数表达式的区别
两个的定义见本文的条目二。对于这两种方式的区别我在上一篇文章里做过测试,我觉得我的猜测还是很有道理,不过这里我还是要提供一些权威的说法:
- 函数声明(function ftn(){}):代码执行之前,解析器就已经读取函数声明并将其添加到执行环境中,因此如下代码运行正常:
1 sayHello(); 2 function sayHello() 3 { 4 alert('Hello'); 5 }
2.(代码如下)函数表达式(var ftn = function(){}):这个会产生运行错误,原因在于函数位于一个初始化语句中,而不是一个函数声明,换句话说,在执行到函数所在语句之前,变量sayHello不会保存对函数引用。
1 sayHello();
2 var sayHello = function ()
3 {
4 alert('Hello');
5 }
五、函数可以当做值使用
函数名是变量,所以函数可以当作值来用,因此我开头写的那个代码就可以理解了,那是把函数作为返回值。用过jQuery的人都会知道:$(document).ready(function(){}),这就是典型的把函数当作参数使用了。
(转)深入理解javascript的function的更多相关文章
- 全面理解Javascript中Function对象的属性和方法
http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...
- 理解JavaScript的function
JavaScript中最有特色而又让你困惑的function算一个了,下面看一下常用操作: function doit(){ ..... } doit(); JavaScript中的函数我们可以把它当 ...
- javascript中 (function(){})();如何理解?
javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- 深入理解JavaScript系列(50):Function模式(下篇)
介绍 本篇我们介绍的一些模式称为初始化模式和性能模式,主要是用在初始化以及提高性能方面,一些模式之前已经提到过,这里只是做一下总结. 立即执行的函数 在本系列第4篇的<立即调用的函数表达式> ...
- 深入理解JavaScript系列(49):Function模式(上篇)
介绍 本篇主要是介绍Function方面使用的一些技巧(上篇),利用Function特性可以编写出很多非常有意思的代码,本篇主要包括:回调模式.配置对象.返回函数.分布程序.柯里化(Currying) ...
- 深入理解JavaScript运行机制
深入理解JavaScript运行机制 前言 本文是写作在给团队新人培训之际,所以其实本文的受众是对JavaScript的运行机制不了解或了解起来有困难的小伙伴.也就是说,其实真正的原理和本文阐述的并不 ...
- 深入理解javascript系列(4):立即调用的函数表达式
本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
随机推荐
- IoC 之 2.2 IoC 容器基本原理(贰)
2.2.1 IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IoC ...
- Link Collecting
----------------------------------\ ACM入门总结之常见输入输出格式暨hdu1089~1096 题解,谨献给对acm感兴趣的新人 - 博客频道 - CSDN.NET ...
- python常见的模块
Python内置模块名称 功能简介 详细解释/使用示例 os 和操作系统相关 os.path — Common pathname manipulations sys 和系统相关 sys — Syste ...
- python中文处理
源码文件为utf-8格式 CODEC = 'utf-8': VS在“高级保存选项”中选择“UTF-8 65001” input(u'中文');print(u'中文')
- 368. Largest Divisible Subset -- 找出一个数组使得数组内的数能够两两整除
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...
- 关于C#迭代器
>1 IEnumerator与IEnumerable IEnumerator与IEnumerable两个接口是用于实现迭代器的接品只要实现了IEnumerable就可以用foreach,linq ...
- FileUpload上传与下载
后台代码: public string connstr = "server=128.1.3.113;database=test;uid=sa;pwd=pass"; protecte ...
- 3D MAX在立方体的使用
3D MAX不会“复用”立方体的顶点-----它直接计算该立方体需要12个三角面,每个三角面需要3个顶点,这样一共是36个顶点-----其实有大量顶点的位置是相同的,但3D MAX不管这些.它认为 ...
- Hduacm—5497
#include <cstring> #include <cstdio> #include <iostream> using namespace std; type ...
- C#Winform从页面获取数据,传入数据库
环境: 1.SQLite数据库新建数据表,设置相应的字段.(其他数据库形式都相似,using相应数据库的包即可) 2.页面有两个textBox:textBox1.textBox2, 3.一个保存按钮: ...