对象直接量创建一个对象:

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对象直接量,数组直接量和函数直接量相关推荐

  1. JQuery对象和JS对象区别与转换|| 事件绑定 入口函数 样式控制

    JQuery对象和JS对象区别与转换   1. JQuery对象在操作时,更加方便.     2. JQuery对象和js对象方法不通用的.     3. 两者相互转换         * jq -- ...

  2. java js对象转字符串数组_js 转json格式的字符串为对象或数组(前后台)的方法

    一.前台 // 转换成对象 var myObject = JSON.parse(_data); alert("对象:"+myObject.msg); // 转换成数组 var my ...

  3. js 对象合并 与数组合并

    在 JavaScript 中,对象和数组都是非常常见的数据结构,它们可以用来存储和操作数据.有时候我们需要将两个对象或数组合并在一起,以便更好地进行操作.本文将会介绍如何在 JavaScript 中合 ...

  4. java js对象转字符串数组_JS数组转字符串(3种方法)【转】

    JavaScript 允许数组与字符串之间相互转换.其中 Array 方法对象定义了 3 个方法,可以把数组转换为字符串,如表所示. 数组方法 说明 toString() 将数组转换成一个字符串 to ...

  5. js对象转byte数组

    因为网上搜的很多教程都不靠,所以我自己写下这篇文章. 其实很简单: /** * objectToByte  对象格式转byte[] * @param {Object} obj */ function ...

  6. JS 对象转化为数组

    上代码: let result = {'121332':'dedsdf','3434':'fgfsdf','3477':'dhff'};let resultArr = []; for(let item ...

  7. 在js对象上绑定js数组原生方法

    在js对象上绑定js数组原生方法 在js对象上绑定数组方法会给当前对象添加一个lenght:0属性 例: var o = {}; [].pop.call(o) console.log(o)//返回结果 ...

  8. js对象是什么?js对象类型有哪些?js对象类型的总结

    对象是需求场景中的名词(如人.事.物)在程序中的表示 JavaScript中,除了string.number.Boolean.null.undefined之外,其他的数据都是对象,如数组.日期甚至函数 ...

  9. js中自定义对象、json对象、json字符串、普通js对象 --js学习那本书上的

    4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...

  10. js中自定义对象、json对象、json字符串、普通js对象

    4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...

最新文章

  1. Linux command: ps -ef |grep java
  2. PostgreSQL 9.6.0 手册
  3. instanceof java list_Java:Instanceof和泛型
  4. 【Java5】String类,StringBuilder类,ArrayList类,Object类(toString,equals,hashCode)
  5. [转]GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名
  6. linux shell运行脚本命令行参数,shell脚本命令行参数简介
  7. UIImage 图片处理:截图,缩放,设定大小,存储
  8. SplitContainer如何实现左导航,右显示与导航相关内容
  9. jQuery复习:第五章
  10. 信号与系统实验之信号的时域分析(Python+matplotlib)
  11. 微信头像制作小程序源码
  12. VS 2010 与 VS 2008的区别
  13. Html5之canvas重叠矩形、getContext、fillStyle、fillRect
  14. 有哪些高性价比的LoRa模块?
  15. Acer Linux改win7,宏基台式机win10如何改win7系统_宏基台式机预装win10怎么换win7
  16. opencv中mask参数
  17. 罗密哦与朱丽叶----this指针、函数封装
  18. Anaconda创建新环境失败解决方案
  19. 【8082端口被占用】
  20. 做了一款 TCP/IP 调试工具

热门文章

  1. 异步编程之Promise(2):探究原理
  2. 基于C#的UDP协议的同步实现
  3. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]
  4. DotNet关键知识点——WCF篇(六)
  5. 堆和栈的区别(面试经验总结)
  6. IDEA函数调用关系图插件
  7. 如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之
  8. C#在客户端和服务端操作Excel文件
  9. 四层和七层交换技术-loadbalance
  10. 【Linux】延时函数sleep、usleep、nanosleep、select、pselect的比较