私人定制javascript中函数小知识点
函数的定义
首先在javascript中,函数就是对象,程序可以随意操控它们。比如,可以给它们设置属性,甚至调用它们的方法。函数使用function关键字来定义。它既可以用在函数定义表达式,也可以用在函数声明语句中。函数声明function后面必须要更上函数名称也就是所谓的函数名称标识符。如果是函数表达式函数名称标识符可有可无。这段重点是函数是对象,所以函数表现出来的种种行为你想想成对象,那么很多疑惑可能就恍如昨日初见。
函数调用
4种方式来调用javascript函数:
1.作为函数
就是函数名称后加上圆括号加上参数列表 例如 func(2,3); 这里需要说明的是如果函数里有没有return obj;那么改函数返回值都是undefined除非返回就是undefined值。每个函数都有默认的返回值undefined;除非给予返回值。
2.作为方法
如果一个对象的属性被赋值为一个函数表达式,那么该函数就被当作一个方法,而不是作为一个普通函数来调用了。
例如:o.m=f; o.m();
3.作为构造函数
如果函数或方法调用之前带有关键字new,它就是构造函数调用,构造函数调用和普通的函数调用以及方法调用在实参处理,调用上下文和返回值方面都有不同。 构造函数通常不会使用return关键字,它们通常初始化新对象。
4.通过它们的call()和apply()方法间接调用
再次强调javascript中的函数也是对象,和其他javascript对象一样,函数对象也可以包含方法,其中每个函数都都有两个很熟悉不过的函数call()和apply()可以用来间接地调用函数。指定上下文this值,指定参数列表。后者传入参数时需要按照数组的形式传入参数。
函数的实参对象
如果在调用方法时少传参数,那么其余参数都将置为undefined。那么如何知道到底传了多少参数呢,实际的参数到底是多少个呢?在函数体内,标识符arguments就是指向实参对象的引用,实参对象视一个类数组对象。
例如
function f(x,y,z)
{
if(arguments.length!=3){
throw new Error(“arguments length is should be 3”);
}
}
arguments.length是指实参个数,而f.length是指形参的个数
callee和caller属性
callee属性指代当前正在执行的函数,caller可以访问调用栈
浅说闭包
现在不得不扯到闭包,javascript采用词法作用域,就是说函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数执行时决定的。为了实现这种词法作用域,javascript函数对象的内部状态不仅包含函数逻辑代码,还必须引用当前的作用域链。函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性就叫做闭包。函数定义时的作用域链在调用函数时依然有效,但是这并不影响闭包。
首先上一段简单的代码:
var scope=”global scope”;
function f(){
var scope=“local scope”;
function func(){return scope;}
return func();
}
console.log(f()); //”local scope“
简单解释一下,关键是变量scope在函数func定义的时候就在同一个作用域链中,而var scope=”global scope”;是在最外层的作用域中,一般都在作用域中都会存在一个变量对象来专门存放作用域链,全局变量肯定是最先被存放就进去,即压入栈底,而此时在执行调用func就会找最近的变量scope找到了,立马返回。所以就会是local scope不知道我的语言组织你能明白么?
var scope=”global scope”;
function f(){
var scope=“local scope”;
function func(){return scope;}
return func;
}
console.log(f()());
请问结果是多少?
这个时候将javascript词法作用域的基本规则体现的很淋漓尽致,javascript函数执行用到了作用域链,这个作用域链式函数定义的时候创建的。嵌套的函数func()定义在这个作用域链里,其中变量scope一定是选取最近的局部变量,不管任何时候执行func(),这种绑定在执行func()时依然有效,因此返回为”local scope”. 多个函数共享一个作用域
function counterfun(){
var n=0;
return{
count:function(){return n++;},
reset:function(){return n=0;}
};
}
var c=counterfun(),d=counterfun();
console.log(c.count()); //0
console.log(c.reset()); //0
console.log(d.count()); //0
console.log(c.reset()); //0
console.log(d.count());//
分析:因为函数count和reset共享一个属性,所以如果c.count()和c.reset()都会改变n的值并且相互影响,但是影响不了d.count()和d.reset()因为它们创建了各自独立的作用域链。 但是为什么n的值会被保存下来呢?此时你再回过头看看scope变量的那个例子道理一样,用return返回函数时都已经将私有变量保存起来了,下次再执行时肯定还是取这段作用域中的变量来操作。
易出错且经典的例子
如下:
function constfuncs(){
var funcs=[];
for(var i=0;i<10;i++)
funcs[i]=function(){return i;};
return funcs;
}
var funcs=constfuncs();
console.log(funcs[5]());//输出是什么呢?
这个应该不会出错吧。必须是10,因为这里所有的函数funcs[i]都共享一个作用域链其中变量i同样是共享。所以最终是循环结束的最大值10 那接下来的这个呢?
function constfunc(v){return function(){return v;};}
var funcs=[];
for(var i=0;i<10;i++) funcs[i]=constfunc(i);
console.log(funcs[5]());//输出是什么呢?
输出是5,结果是我们预期的。 这里如果按照所有的函数作用域是定义的时候就确定了的,理解起来比较费劲么,不管你信不信,反正我是中枪了。 从函数嵌套来理解,因为函数中返回函数嵌套时必须会将函数及其作用域链保存起来,这样就新创建了一个作用域链,其中的变量i也就被保存起来赋值给v了,每每return一次就会新创建一个作用域链。所以得到的v就是当时保存的i值。
prototype属性
每个函数都用一个prototype属性,请记住它是函的一个属性,尽管这个prototype我们总是称之为对象,但是它确实是函数的一个对象。它就称之为原型对象,不管你是否打算将这个函数作为构造函数来用。那问题来了,为啥我们要关注prototype属性呢?
1.原生构造函数(如 Object()/Array()/Function()等)使用prototype属性,以便让构造函数实力继承属性和方法。
2.当用户自定义构造函数时,可以像javascript原生对象那样使用继承。
3.可以借用别人编写的优秀代码的时候继承赋值过来自己用
4.通过使用原型继承,我们可以创建有效的对象实例,并且使用相同的方法,这样就节省了很多代码。
结束语
本节重点是函数是对象,所表现出来的一些特性,同时函数作用域链相关的闭包这4个例子应该是堪称经典了,以后可以经常看看,还有比较重要的作用域链等等,以后再深入了解,再继续分享。同时如果有错误,还请指出。今天看了乐嘉书中,觉得有一句话说的挺好的,我全力回顾了自己曾有的梦想,对比已实现的和没实现的,终于发现,梦想都与行动有关,不动就是幻想,动了就是梦想,动到底梦想就实现了。也许我做的梦,刚好也是你的梦,果真如此,此刻开始,你我就算是同梦中人了。如果你觉得对你有所帮助,推荐一下,给我下次写作的动力。
ps: 给大家介绍一个新词(不要问我是谁,请叫我好人)。
路见不平
旧意:指走在路上遇见不公平的事情
新意:指走在路上在一大波平胸妹子中发现一个大波妹子
例句:路见不平,拔屌想护
私人定制javascript中函数小知识点的更多相关文章
- 私人定制javascript中对象小知识点(Only For Me)
废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说 ...
- 私人定制javascript中数组小知识点(Only For Me)
先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊. 2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好, ...
- Javascript中函数的四种调用方式
一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属 ...
- 私人定制自己的linux小系统
私人定制自己的linux小系统 一.前言 linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个linux爱好者都为其贡献了自己的一份力,不管是在 ...
- JavaScript中函数的调用!
JavaScript中函数的调用! 1 普通函数 // 1 普通函数 function fn() { console.log(123); } // 函数名 + 一个小括号! 或者 函数名.call() ...
- JavaScript中函数的定义!
JavaScript中函数的定义! 1 自定义函数(命名函数) function fun() {}; 2 函数表达式(匿名函数) var fun = function () {}; 3 利用 new ...
- JavaScript中函数函数的定义与变量的声明<基础知识一>
1.JavaScript中函数的三种构造方式 a.function createFun(){ } b.var createFun=function (){ } c.var createFun=new ...
- JavaScript中函数的形参和实参的实现原理剖析
我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...
- JavaScript apply函数小案例
//回调函数1 function callback(a,b,c) { alert(a+b+c); } //回调函数2 function callback2(a,b) { alert(a+b); } / ...
随机推荐
- cocos2dx环境配置和打包
安装软件准备就绪: vs2012 cocos2d-x-2.2.1 adt-bundle-windows-x86_64-20121030 android-ndk-r9c-windows-x86_64 j ...
- [LeetCode234]Palindrome Linked List
题目: Given a singly linked list, determine if it is a palindrome. 判断一个单链表是不是回文 思路: 1.遍历整个链表,将链表每个节点的值 ...
- nyoj 题号12 水厂(两)——南阳oj
标题信息: 喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 有一块草坪.横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=1000 ...
- 未能加载文件或程序集“Common”或它的某一个依赖项。试图加载格式不正确的程序
原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS——应用程序池——高级设置——启用32位应用程序 :true.解决方案二:修改 ...
- IDEA内存异常问题
设置工程运行Server VM属性 VM options: -Xms258m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m 如图 :
- EasyUI禁用控制方法常采用
EasyUI禁用控制方法常采用: 1.validatebox使用可以使用:前两个适用于个人validatebox; 第三适用于整个form内箱; <1>.$("#id& ...
- POJ 1699 Best Sequence (DFS+预处理)
意甲冠军:看图片是晶莹剔透的,正确的, N连接到第一序列(同样的序列部分).总序列获得最短. 主题链接:http://poj.org/problem?id=1699 ~~~~ 思路就是:将N个序列首尾 ...
- CodeForces 482C Game with Strings
意甲冠军: n一定长度m串 隐藏的字符串相等的概率 然后,你猜怎么着玩家隐藏的字符串 的询问字符串的一个位置 再不断的知道一些位置后 游戏者就能够确定藏起来的串是什么 问 游戏者的期望步 ...
- SqlServer 添加列并赋值
有个需求,需要给某张表添加一列并且赋值,分解需求,一共分两部走: 添加列 赋值 两个功能都不难,很快实现. --add column alter table Med_Summary_Template ...
- 淘宝API学习之道:淘宝API相关了解
淘宝API开发平台,经过两年多的升级一系列动作,提供的api接口日渐稳定.看到淘宝api开发的浏览量还是较大,但那会写的DEMO如今已不能执行,淘宝改了链接地址,改了加密算法,为了不让大家浪费时间,特 ...