javascript下面这段代码中小括号里面大括号怎么打是什么意思?函数执行顺序?

什么叫带有默认参数的函数,java函数式编程,分段函数大括号怎么打,javascript调用函数,函数参数怎么添加一个
导读:前言 虽然放假,[emailprotected],@城府很深,@苏州小浮云联合翻译的。 正文从这开始~ 函数(Function )这个词对程序猿来说并不陌生. 哪怕你每天只写一点点代码, 你也得在下班前把正在创建或者修改的函数给close掉. 简单来说函数就是一组执行某些动作的
  虽然放假,[email protected],@城府很深,@苏州小浮云联合翻译的。
  正文从这开始~
  函数(Function )这个词对程序猿来说并不陌生. 哪怕你每天只写一点点代码, 你也得在下班前把正在创建或者修改的函数给close掉.
  简单来说函数就是一组执行某些动作的一堆程序语句. 一个函数可能有一些输入参数(在方法体内使用)并且执行完成之后返回一个值.
  Java的函数也具有这些特点,不过他们可不止这些特点. 函数在Java里面是对象. Java里面几乎所有的东西都是对象,我在 《Java 对象》 这篇文章里提到过这些内容.
  作为一个对象,Java的函数拥有属性和其他的函数(也就是方法)。让我们来看一个Java中典型的函数定义.
  就是这样。上面的函数没有做太多的事,只是输出了一句欢迎访问者来到我的博客. 不过它已经演示了一个Java应该长什么样子. 定义一个函数是以关键字 function 开头,后面跟着函数名然后括号里加入0个或多个参数). 然后实际的函数代码(Java程序语句)包含在一对大括号里 { }. 函数可以有返回语句 return 这个语句是可选的. 不过函数都会返回一个值. 如果方法体中没有返回语句,那么方法会返回undefined(未定义).
  下面的代码使用访问者姓名作为参数传递函数并调用它.
  到这里,我们只是见识到了函数的基本特点. 接下来我们来近距离的观察下Java函数的高级特性.
  匿名函数
  一个 Java 函数可以是匿名的. 意思是说函数定义的时候你可以省略掉函数名. 不过,函数必须被存储在一个变量里,像下面这样.
  上面的语法也称为函数表达式。你可以把变量addNumbers当作函数名然后按照如下方式调用该函数。
  函数表达式会很方便当你想要将一个函数作为参数传递给另一个函数时。让我们试着用一个简单的例子来理解这个。
  我首先创建了两个匿名函数。第一个返回两个数的和,第二个返回两个数的积。这相当的简单,没有什么值得骄傲的。接着,我定义了一个函数calculate,它的第一个参数是函数类型,后面两个参数是数值类型。
  我可以通过传递任何函数作为第一个参数来调用函数calculate。
  将函数通过参数形式传递是不是很简单. 这种方式在AJAX调用场景中被大量使用,比如你传入一个回调函数,当AJAX调用完成后用来处理成功或失败结果.
  使用更多参数
  Java 在处理传递或接收函数参数时非常灵活. 我们来看下操作”函数参数“的几种方式.
  丢失的参数
  调用一个函数可以传递比预期更多或更少的参数。如果你调用一个方法,少传递了一个参数,那么没传递的那个参数的值会被设为undefined.
  参数对象
  所有的Java函数都有一个特殊的对象 arguments 它是一个参数数组,在函数调用过程中被传递. 这个对象可以用来访问参数列表中的单独项,也可以获取参数传递至函数过程中的参数总个数.
  这个函数假设没有参数传递进来,就像我说的,在Java函数调用中,你可以传递任意数量的参数. 因此我也可以这样调用方法:
  所有的参数都可以在 arguments 对象数组中找到. 可以使用 arguments.length 属性获取传递参数的个数.
  默认参数
  你是 C++ 或者 C# 程序猿吗? 你见过有默认参数的函数吗? 可能见过! ECMA 6 把这个特性加入了Java,因此你就可以定义一个默认参数的函数.
  这个函数礼貌的向我的博客访问者问好. 它接收一个 name 和 profession 参数,然后显示一条欢迎信息. 第二个参数接收一个默认值(如果没有传递或者传递了一个undefined).
  函数嵌套
  一个函数内部可以包含内部函数. 内部函数又再次可以包含内部函数。来看下代码.
  wakeUpAndCode 这个函数包含两个内部函数 wakeUp 和 code. 当调用 wakeUpAndCode 后, 开始执行方法体. 外部方法只有两条执行语句, 分别是对 wakeUp 和 code方法的调用 . 调用 wakeUp 函数会在控制台输出字符 “I just woke up” . 调用 code 函数会在控制台输出字符 “I am ready to code now” .
  内部函数可以访问所有外部函数的变量和参数. 但是内部函数是函数内一种私有类型的实现,它不能被它所在的函数之外的函数访问. 关于使用内部函数与闭包问题将在其他文章讨论.
  “ 自执行函数表达式 ” (IIFE, 读作&iffy& 好吧随你怎么叫)
  IIFE (即时执行函数)是一个声明完成马上执行的匿名函数,它长这样:
  你只需要创建一个匿名函数,在方法定义结尾处加一对圆括号,然后把所有的代码再通过圆括号括起来. 最外层的括号里会把所有内容转化成表达式,因为Java的括号里不能写程序语句. 函数定义后面的一对括号可以让函数立即执行.
  任何在自执行函数体内定义的变量都是局部有效的,并且不能被任何此作用域之外的代码访问或改变.
  看下面的代码. 这个函数不需要被调用就会自动执行.
  把代码复制黏贴到 plunker 然后再浏览器控制台查看输出结果. 如果你不知道怎么打开浏览器控制台, 按F12键就会打开开发者工具. 然后点击 console 选项卡查看 console.log 语句的输出内容.
  IIFE 是一个很好的在代码段中创建局部作用域的方法. 这么做的好处是可以保护你的变量和函数被应用程序中的其他部分复写掉. 那 IIFE 还有什么其他的优势? 还有他们怎么解决全局变量污染问题? 等我下一篇关于自执行表达式的文章.
  构造函数
  一个函数可以作为构造函数使用,并且可以使用构造函数来创建新的对象. 这个特性使Java更加面向对象. 使用构造函数的优势是你可以创建很多预定义对象和方法. 如果你把构造函数与其他语言的类和对象关联起来,那么你就对了。
  我们来建立一个 Programmer 函数,它有函数构造器,并且有属性和方法. 你可以把它当作一个类如果你使用其他语言.
  这个函数接收三个参数,并使用三个属性和四个方法来创建一个Programmer对象. 上面的代码不用说了吧没,很简单的. 我可以使用下面的代码创建很多programmer对象.
下一篇:没有了
与本文的相关文章推荐您还可以使用以下方式登录
当前位置:&>&&>&&>& > JavaScript面试时候的坑洼沟洄:逗号、冒号与括号
JavaScript面试时候的坑洼沟洄:逗号、冒号与括号
& 看完了javaScript数据类型和表达式与运算符相关知识后以为可以对JavaScript笔试题牛刀小试一把了,没想到有一次次的死在逗号,冒号和括号上,不得已再看看这几个符号吧。&逗号逗号我们常见的用法就是在连续声明一些变量的时候,可以少些很多var&&var a=1,& & b=2,& & c=3;方法参数我们使用逗号隔开,对象属性也是逗号隔开&``` function fbn(name,title){} var person={ name:&Byron&, age:&24& }; ``` 然而我们也会遇到这样的问题,在赋值表达式中出现的逗号&1var a=(1,2,3);在表达式与运算符中提到过逗号运算符就是对应这种情况,这时表达式计算结果是最后一个子表达式结果,也就是3。千万不要误会前面的子表达式不会执行,每个子表达式都会执行,只不过&返回值&是最后一个表达式结果。&&var a,b;a=(b=1,2);console.log(a);//2console.log(b);//1冒号?:运算符&var p=gender ? 'male':对象字面量&&var obj={& & name:&Byron&,& & age:24};switch语句&&switch(t){& & case 1:& & & & console.log('xxx');& & & && & case 2:& & & & console.log('ooo');& & & &}相信这是大家所熟知的用法了,那么我们可以个题目&1x:y:z:1,2,3;上面运算会不会报错?不报错运算结果是什么?很多同学初次看到这个会很惊讶,觉得肯定会出错,但结果却是3,来看看为什么&其实冒号还有个作用:声明label,JavaScript中语句可以有个标签前缀,我们称之为标记语句,break或continue可以和标记的语句结合使用,控制流程。如果标签有重复,就会出错。我们上面的语句可以翻译成这样&&x:&y:& z:1,2,3这样我们结合刚才说的逗号的知识就能明白为什么结果是3了,很多优化建议都是不提倡使用标签的,有没有想起C语言的goto,使用了标签控制流程,使程序相当难读懂。&var x=1;foo:{& & x=2;& && & x=3;}console.log(x);大括号对象直接量声明&&var obj={& & name:&Byron&,& & age:24};整条语句使赋值语句,右值部分十个表达式,通过直接量构造出一个对象&函数声明或者函数直接量&&function fn1(){&& & //....}&br&var fn2=function(){& & //...};相信这种用法不闭多说什么了&组织复合语句&&with(obj){& & //...}for(){&//...}if(){& & //...}else{& & //...}大括号没有带来块级作用域熟悉JavaScript的同学肯定对这点儿已经熟知了,大括号虽然能够组织复杂的语句等,是指算是同一&块&,with甚至提供了相近的功能,但遗憾的使JavaScript只有函数作用域,没有块作用域,再JavaScript中下面做法会声明全局变量,这个小小的知识点往往引英雄竞折腰&在function外使用声明变量(无论是否使用var)在function内不是用var 声明变量直接赋值于window属性&var a=2;function fn(){& & b=3;& & window.c=4;}除了这三种剩下的就是function范围内的局部变量了,在很多JavaScript规范中都有提到,尽量提早声明变量正是由于其没有块作用域&&function fn(n){& & if(n&1){& & & & var a=n;& & }else{& & & & var b=n;& & }& & console.log(a);}这样的代码在很多语言中有语法错误,因为if和else的大括号有块作用域,变量a、b在自己对应块作用域中,出了块就访问不到了。但在JavaScript中,没有块作用域,所以我们在if、else内声明的变量console.log依然能够访问,这确实是糟糕的设计,为了减少错误可能,尽量把变量声明提前。&很多笔试题目正是针对这方面知识出题的&&{a:1};var x={a:1};{a:1,b:2};var y={a:1,b:2};亲自试试是不是发现很惊讶,我们分析一下&{a:1} JavaScript有传说中的&语句优先&,也就是当大括号既可以被理解为复合语句块也可以被理解为对象直接量的时候,JavaScript会将其理解为复合语句快。{a:1}其实就是 a: 1,想想冒号的作用是不是知道为什么返回值是1了。&var x={a:1} 当{a:1} 作为右值出现的时候,明显就不是语句,而是直接量表达式了,所以把大括号当作对象直接量语法处理,结果是个对象。&{a:1,b:2}; 看了上面这个就简单了,可以翻译为:a:1,b:2 结合逗号和冒号作用,结果似乎显而易见了,就是2嘛。然而其实报错了,这是为什么?在逗号运算符后面必须是表达式,而标签语句十个label statement,是条语句,所以就报错了。&了解了这些知识我们再来试几个题目(看答案在控制台上,不要试图alert)&{foo:[1,2,3]}[0];{a:1}+2;2+{a:1};不知道小伙伴儿们做对了没有,这几个题目核心一样,大括号虽然看起来没什么作用,但起到了语句分隔符作用,{foo:[1,2,3]}[0]可以理解为&&{foo:[1,2,3]};[0];所以返回值是[0],同样{a:1}+2变为&&{a:1};+2但是!为什么2+{a:1}就不一样了呢?这时加法运算符导致的,加号是左结合的,{}被解析为表达式(得是表达式相加嘛),根据数据类型中知识对象{a:1}转换为NaN&小括号在JavaScript中小括号有几种用法&函数声明或调用表达式参数表&这个好理解,函数定义的时候需要用小括号将其参数包裹,用逗号隔开,调用的时候也一样&&function fn(name,age){& & //...}fn('Byron',24);var f=new fn('Byron',24)与一些关键字组成条件语句&我们常见的if、switch、while中的小括号就是干这个用的&&if(a&0){& & //...}while(i&len){& & //...}for(var i=0;i&i++){& & //...}分组运算符 分组运算符内部只能包含表达式,可以改变运算符优先级,舍弃一些可能的语法树,最常见的&&var x=()1+2)*3;相信不用多解释,很多同学会认为小括号有强制表达式运算的功能,其实这时片面的理解,这只是改变了运算符优先级,生成新的语法树后的结果。对于简单的json字符串转为对象的时候,因为浏览器兼容性原因,不能使用JSON对象,又懒得引入json2,所以就会用eval()处理,大概写法这样&&var jsonStr=...;var jsonObj=eval('(' + jsonStr + ')');很多同学会问,为什么还要加上个小括号呢?像我们上面解释的大括号的作用,json字符串 &{a:1,b:2}& 这样的格式会被理解为语句,也就是传说中的label statement,语法树是这样的&{a:1,b:2}&上面提到过逗号运算符不能在label statement后面,所以会报错,而加上括号后由于分组运算符只能包含表达式,所以{}变成直接量语法,这样就是我们希望的内容了。&立即调用的函数表达式再来回头看看我们所谓的立即执行函数,一般有两种写法&(function(){})();(function(){}());!function(){}();搜了很多资料,终于看到了靠谱解释,总结一下,首先我们需要搞清楚函数表达式和函数声明区别,ECMAScript规范中定义的相当模糊:函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符:&  函数声明:&  function 函数名称 (参数:可选){ 函数体 }&  函数表达式:&  function 函数名称(可选)(参数:可选){ 函数体 }&其实我们常用的区分方式是根据上下文,如果function fn(){}作为右值出现(赋值表达式右边)那么就是表达式,否则就是函数声明。有几种看起来不常规的方式需要我们注意&new function fn(){}; //表达式,因为在new 表达式中(function(){}());//表达式,在分组运算符中这样我们就能理解第二种写法了,就是利用分组运算符改变了语法树。同样第三种写法其实是利用了一元运算符后面跟表达式的原理,我们也可以写成&&+function(){}()-function(){}()~function(){}()知乎上长天之云甚至写出了这么多&&( function() {}() );( function() {} )();[ function() {}() ];////////////////////////////////~ function() {}();! function() {}();+ function() {}();- function() {}();////////////////////////////////delete function() {}();typeof function() {}();void function() {}();new function() {}();new function() {};/////////////////////////////////var f = function() {}();/////////////////////////////////1, function() {}();1 ^ function() {}();1 & function() {}();所以我们应该称立即执行函数为立即调用的函数表达式!&中括号相对而言中括号是个最简单的符号了,一般有几种语义&*数组相关&我们知道数组可以通过中括号来直接量实例化&&var a=[1,2,3];*获取对象属性值&这也是很常见的用法&&var a=[1,2,3];var b={name:'Byron'};a[2];b['name'];看几个有意思的小题目&&[1,2,3,4,5][0..toString.length];//0.等同于0.0'foo'.split('') + [];
欢迎转载:
推荐:    这段JS代码为什么要用小括号括起来呢? - ITeye问答
(function()
var _sDomain = location.search.split("?").pop().split("&").shift();
window.onerror = function(){};
_sDomain && (document.domain = decodeURIComponent(_sDomain));
&script src="/js/platform.js" charset="utf8"&&/script&
很少用到JS,今天看到一段代码,不明白为什么要这样写。
function(),这里为什么要用小括号括起来呢?
var a = function(){ alert('i'm a'); }
a();
这个理解吧?
根据等量替换原则就可以这样啦:
(function(){ alert('i'm a'); })();
(function(){代码})()就等于执行了一个函数,而这个函数却没有函数名而已!
也被称匿名函数的调用
目的是为防止其它的代码污染它。保证它本身的执行环境不受其它代码干扰。--闭包的作用。
JQuery用得少吧?
闭包,函数声明后执行
已解决问题
未解决问题

我要回帖

更多关于 word大括号 的文章

 

随机推荐