JavaScript对象(一)——Function对象
写在最前面:
对象只是带有属性和方法的特殊数据类型(js的7种数据类型:字符串,数字,布尔,数组,对象,null,undefined)。
JavaScript是面向对象的语言,但是JavaScript和其他面向对象语言不同,它没有类的概念。没有类自然也不会通过类来创建对象,JavaScript基于prototype,而不是基于类。
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...此外,JavaScript 允许自定义对象。
JavaScript 提供多个内建对象,比如 String、Date、Array 等等,先从Function开始。
对象是带有属性和方法的特殊数据类型,从这句话入手,从三方面看一看Function对象:1、声明(数据类型)2、属性 3、方法
一、声明
1、函数声明
function foo(argname1,argname2,...){
body// do something
}
2、函数表达式
var foo = function(argname1,argname2,...){
body// do something
}
3、Function构造函数
var foo = new Function(argname1,argname2,...,body);
二、属性(不包括继承来的属性)
1、arguments属性
获取当前正在执行的 Function 对象的参数(arguments对象)。
示例:
function ArgTest(arg1, arg2){
var s = "";
s += "The individual arguments are: "
for (n = 0; n < arguments.length; n++){//arguments是对象属性,它本身也是对象,有length属性
s += ArgTest.arguments[n];
s += " ";
}
return(s);
}
console.log(ArgTest("yuanliang","shuai"));
输出结果:The individual arguments are: yuanliang shuai
2、caller属性
获取调用当前函数的函数。
caller 属性只有当函数正在执行时才被定义。 如果函数是从 JavaScript 程序的顶层调用的,则 caller 包含 null。
示例:
function callerFun(){
console.log(callerFun.caller);//只有函数正在执行时才被定义
} function init(){
callerFun();
} init();
callerFun();
输出结果:function init(){callerFun();} null //第一次调用callerFun()是通过init函数调用的,故返回init函数,第二次直接调用故返回null
3、length属性
获取函数的参数数目
创建函数的实例后,脚本引擎将该函数的 length 属性初始化为该函数定义中的参数数量。
示例:
function lengthFun(arg1,arg2,arg3,arg4){
console.log("lengthFun's length="+lengthFun.length);
console.log("arguments' length="+arguments.length);
} lengthFun(1,2,3);
输出结果:lengthFun's length=4 arguments' length=3
从示例中能够看到,Function对象的length和arguemnts的length不一定相同。
三、方法(不包括继承自Object对象的方法)
1、apply() 和 call()方法
见上一篇博客:http://www.cnblogs.com/wangyuanliang/p/4264505.html
2、bind()方法
对于给定函数,创建与原始函数相同的主体的绑定函数。 在绑定函数中,this 对象将解析为传入的对象。 绑定函数具有指定的初始参数。
function.bind(thisArg[,arg1[,arg2[,argN]]])
function
必选。 一个函数对象。
thisArg
必选。 this 关键字可在新函数中引用的对象。//一个对象,
arg1[,arg2[,argN]]]
可选。 要传递到新函数的参数的列表。
示例1:
function bindFun(value){
if(typeof value !== 'number')
console.log("not a number");
else
value>=this.min&&value<=this.max?console.log("number is correct!"):console.log("number is wrong!");
}
var option = {max:50,min:10};
var judgeFun = bindFun.bind(option);
judgeFun(30);
judgeFun(80);
输出结果:number is correct! number is wrong! //第一个在范围之内返回correct 第二个不在范围返回wrong
这里的参数option对应thisArg,为必填参数。
示例2:
function bindParamFun(arg1,arg2,arg3,arg4){
console.log("bindParamFun params are : "+arg1+arg2+arg3+arg4);
}
var emptyObject = {}; var bindParamFun2 = bindParamFun.bind(emptyObject,"a","b");
bindParamFun2("c","d","e");
输出结果:bindParamFun params are : abcd //在bindParamFun2中第一个参数是一个空的对象,充当thisArg,如果没有此参数,“a”将被当做thisArg,输出结果将是:bindParamFun params are : bcde
四、一些需要特别注意的地方
1、如何选择声明方式?
在(一、声明)中的三种方式中我们应该选择哪一种才是合适的呢?
大多数javascript书籍里面不推荐使用第三种,原因第三种存在严重的性能问题,这种定义会解析两次代码,第一次是常规的解析这条语句,第二次要把函数里的字符串解析成实际的函数。我们可以通过第三种方式可以理解到:javascript的函数其实是对象(object),而函数名是指向对象的地址。
函数声明和函数表达式:
这两个方式在性能上没有太大的去区别,但由于JavaSctipt预加载顺序的不同,在定义函数时需要注意一下。
代码执行之前,解析器就已经读取函数声明并将其添加到执行环境中,要早于基础基础数据类型的定义。
示例1:
function foo2(){
console.log("foo1");
} var fun = foo2;
function foo2(){
fun();
console.log("foo2");
}
foo2();
输出结果:too much recursion //出现递归,内存溢出
如果改为:
示例2:
var foo2 = function(){
console.log("foo1");
};
var fun = foo2;
var foo2 = function(){
fun();
console.log("foo2");
};
foo2();
输出结果:foo1 foo2
原因就是在代码执行前,JavaScript会将function提前定义,即:funciton=>var
对比
function foo2(){console.log("foo1");}; //old var foo2 = function(){console.log("foo1)}; //foo2指向旧的方法
function foo2(fun();console.log("foo2")); //new var fun = foo2; //将foo2的地址给fun 即fun指向旧的方法
var fun = foo2; //fun指向的地址是新的foo2 foo2 = function(){fun();console.log("foo2)}; //foo2指向新的方法的地址 fun不变
foo2(); //此时就会出现内存溢出 foo2(); //执行foo2
2、没有重载
JavaScript中的function没有重载,后面的定义将会覆盖前面的定义。
function foo(arg1,arg2,arg3){
console.log("This is a function:"+arg1+arg2+arg3);
}
function foo(arg1,arg2){
console.log("Be Better:"+arg1+arg2);
}
foo("hello","world","leon"); //没有区执行三个参数的方法
输出结果:Be Better:helloworld
明显,在传入三个参数的情况下,仍然执行了后面定义的方法,原因是发生了覆盖而不是重载。相当于:
var foo = function(arg1,arg2,arg3){
console.log("This is a function:"+arg1+arg2+arg3);
} foo = function(arg1,arg2){
console.log("Be Better:"+arg1+arg2);
}
foo("hello","world","leon");
JavaScript对象(一)——Function对象的更多相关文章
- Javascript学习之Function对象详解
JavaScript中的Function对象,就是我们常说的函数对象.在JS中,所有的函数也是以对象的形式存在的. 语法 充当Function对象的构造函数使用,用于结合new关键字构造一个新的Fun ...
- Javascript Object、Function对象
1.Object对象 原型对象 原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. <script type="text/javas ...
- javascript中的function对象
function对象都是Function的实例: > Object.getOwnPropertyNames(Function) [ 'length', 'name', 'arguments', ...
- JavaScript 函数对象(Function 对象)
函数对象 当我们对函数使用 typeof 操作符会返回什么? function f() { console.log('hello') } console.dir(typeof f) // functi ...
- Javascript高级篇-Function对象
1.引入 1.1Function是基于原型的对象 2.创建Function对象 2.1 var myFun = new Function("参数一","参数二" ...
- Javascript基础--函数(Function对象)
1.函数是一段可执行的代码,函数可多次调用,模块化管理. 2.使用function语句,function funName([arg1][,arg2]....[,argn]){代码块}.所有版本可用,一 ...
- javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)
写作缘由: 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种 ...
- Object对象和function对象
Obejct对象 1.ECMAScript 中的 Object 对象与 Java 中的 java.lang.Object 相似. 2.ECMAScript中的所有对象都由Object对象继承而来,Ob ...
- JavaScript学习09 函数本质及Function对象深入探索
JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...
- javascript对象模型和function对象
javascript中,函数就是对象 <html> <head> <script type="text/javascript"> functio ...
随机推荐
- 修改mysql错误提示语言的方法
百度真的太恶心太无能了. 装了个mysql5,结果发现错误提示语言是法语. 然后我就想改成把错误提示语改成英语. 然后我使用各种关键字和方法百度了一个上午,居然全TM是告诉我怎么处理mysql中文乱码 ...
- [php] PHP创建指定目录和文件
前几天看到有人问PHP环境下如何创建文件到指定目录下,正好自己最近在学习,经过一翻测试,终于出结果了,贴出来与大家分享. 目录结构: 代码所在的文件wwwroot/mydir/test/test.ph ...
- NAS4Free 安装配置(五)配置SMB
配置SMB 现在我们有2块存储设备,一块做下载盘,一块做数据盘 为了便于管理和扩展,我们分别在两块盘上建文件夹和Dataset 对于download盘,因为是UFS,所以只能建文件夹 我们把整个盘共享 ...
- Cstring获取第N个字符
void CTestaDlg::GetCStringItemAt(CString strin,CString & strout,int nindex) { ); ; ]={'\0'}; whi ...
- python 安装 ez_setup.py出现的问题及解决办法
试了网上好几个解决办法. 下面这个办法是最对我胃口的. ~~~~~~~~~~~~~~~~ 安装ez_setup.py时出现了这个问题: UnicodeDecodeError: 'ascii' cod ...
- SQL Server聚合函数
聚合函数对一组值计算后返回单个值.除了count(统计项数)函数以外,其他的聚合函数在计算式都会忽略空值(null).所有的聚合函数均为确定性函数.即任何时候使用一组相同的输入值调用聚合函数执行后的返 ...
- HttpStatusCode 枚举
.NET Framework 类库 HttpStatusCode 枚举 包含为 HTTP 定义的状态代码的值. 命名空间:System.Net程序集:System(在 system.dll 中) ...
- ArcGIS API for Silverlight学习笔记
ArcGIS API for Silverlight学习笔记(一):为什么要用Silverlight API(转) 你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我都 ...
- 深入浅出Node.js (6) - 理解Buffer
6.1 Buffer结构 6.1.1 模块结构 6.1.2 Buffer对象 6.1.3 Buffer内存分配 6.2 Buffer的转换 6.2.1 字符串转Buffer 6.2.2 Buffer转 ...
- opencart修改后台文件夹名
在使用opencart进行二次开发时,若需要修改后台目录的文件夹名是可以操作的.具体步骤如下: 1.将网站后台文件夹名字改成opencartadmin 2.在该文件夹下找到config.php文件如图 ...