JS对象直接量,数组直接量和函数直接量
对象直接量创建一个对象:
var obj = {x:[1,2],y:23};
代码跟下面是一样的。
var obj=new Object();
obj.x=new Array(1,2);
obj.y=23;
测试:
for(var i in obj) alert(obj[i]);
函数直接量:它是一个表达式而不是语句。
(function(){})()
如下例:
(function(){
document.write("some script code");
})()
var a=(function(s){return s})("abc");
alert(a);
var b=function(s){return s};
alert(b("abc"));
这个如何解释呢?
大家应该记得这种写法
var a=function (){}
那么怎么运行a呢,那么就是a()
同样的道理,我们不通过a这个变量来存那么是如何写法,就是
function(){}()
但是你会发现这样是错的
因为解析引擎解析的时候,解析的时候发现}判断到了函数结束了
并没有把那个函数作为块来运行
那么加上()是强制把function那块作为块
一、什么是匿名函数
在Javascript定义一个函数一般有如下三种方式:
函数关键字(function)语句:
function fnMethodName(x){alert(x);}
函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
Function()构造函数:
var fnMethodName = new Function('x','alert(x);')
上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把 一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。实际上,相当多的语言都有匿名函数。
二、函数字面量和Function()构造函数的区别
虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。
var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1);};
Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数 eval()。
Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。
var y = "global";function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量}alert(constructFunction()()); // 输出 "global" 函数直接量:
只要是表达式语法,脚本宿主就认为 function 是一个直接量函数,如果什么都不加,光以 function 开头的话则认为是一个函数声明,把 function 写进一个表达式内部,比如四则运算,宿主也会将其当作是一个直接量,如下:
var a = 10 + function(){
return 5;
}();
夸张一点,如下:
(function(){
alert(1);
} ) ( );
( function(){
alert(2);
} ( ) );
void function(){
alert(3);
}()
0, function(){
alert(4);
}();
-function(){
alert(5);
}();
+function(){
alert(6);
}();
!function(){
alert(7);
}();
~function(){
alert(8);
}();
typeof function(){
alert(9);
}();
js中定义函数的方式有多种,函数直接量就是其中一种。如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数。
好,看看匿名函数的如何被调用。
1、执行后得到返回值的函数调用
//方式一,调用函数,得到返回值。强制运算符使函数调用执行
(function(x,y){
alert(x+y);
return x+y;
}(3,4));
//方式二,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行
(function(x,y){
alert(x+y);
return x+y;
})(3,4);
2、执行后忽略返回值
//方式三,调用函数,忽略返回值
void function(x) {
x = x-1;
alert(x);
}(9);
嗯,最后看看错误的调用方式
//错误的调用方式
function(x,y){
alert(x+y);
return x+y;
}(3,4);
JS对象直接量,数组直接量和函数直接量相关推荐
- JQuery对象和JS对象区别与转换|| 事件绑定 入口函数 样式控制
JQuery对象和JS对象区别与转换 1. JQuery对象在操作时,更加方便. 2. JQuery对象和js对象方法不通用的. 3. 两者相互转换 * jq -- ...
- java js对象转字符串数组_js 转json格式的字符串为对象或数组(前后台)的方法
一.前台 // 转换成对象 var myObject = JSON.parse(_data); alert("对象:"+myObject.msg); // 转换成数组 var my ...
- js 对象合并 与数组合并
在 JavaScript 中,对象和数组都是非常常见的数据结构,它们可以用来存储和操作数据.有时候我们需要将两个对象或数组合并在一起,以便更好地进行操作.本文将会介绍如何在 JavaScript 中合 ...
- java js对象转字符串数组_JS数组转字符串(3种方法)【转】
JavaScript 允许数组与字符串之间相互转换.其中 Array 方法对象定义了 3 个方法,可以把数组转换为字符串,如表所示. 数组方法 说明 toString() 将数组转换成一个字符串 to ...
- js对象转byte数组
因为网上搜的很多教程都不靠,所以我自己写下这篇文章. 其实很简单: /** * objectToByte 对象格式转byte[] * @param {Object} obj */ function ...
- JS 对象转化为数组
上代码: let result = {'121332':'dedsdf','3434':'fgfsdf','3477':'dhff'};let resultArr = []; for(let item ...
- 在js对象上绑定js数组原生方法
在js对象上绑定js数组原生方法 在js对象上绑定数组方法会给当前对象添加一个lenght:0属性 例: var o = {}; [].pop.call(o) console.log(o)//返回结果 ...
- js对象是什么?js对象类型有哪些?js对象类型的总结
对象是需求场景中的名词(如人.事.物)在程序中的表示 JavaScript中,除了string.number.Boolean.null.undefined之外,其他的数据都是对象,如数组.日期甚至函数 ...
- js中自定义对象、json对象、json字符串、普通js对象 --js学习那本书上的
4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...
- js中自定义对象、json对象、json字符串、普通js对象
4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...
最新文章
- Linux command: ps -ef |grep java
- PostgreSQL 9.6.0 手册
- instanceof java list_Java:Instanceof和泛型
- 【Java5】String类,StringBuilder类,ArrayList类,Object类(toString,equals,hashCode)
- [转]GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名
- linux shell运行脚本命令行参数,shell脚本命令行参数简介
- UIImage 图片处理:截图,缩放,设定大小,存储
- SplitContainer如何实现左导航,右显示与导航相关内容
- jQuery复习:第五章
- 信号与系统实验之信号的时域分析(Python+matplotlib)
- 微信头像制作小程序源码
- VS 2010 与 VS 2008的区别
- Html5之canvas重叠矩形、getContext、fillStyle、fillRect
- 有哪些高性价比的LoRa模块?
- Acer Linux改win7,宏基台式机win10如何改win7系统_宏基台式机预装win10怎么换win7
- opencv中mask参数
- 罗密哦与朱丽叶----this指针、函数封装
- Anaconda创建新环境失败解决方案
- 【8082端口被占用】
- 做了一款 TCP/IP 调试工具