JS中小括号的用法总结

Wesley13
• 阅读 690

小括号用法

1. 改变运算符的优先级

var a = 4 * (1 + 2); console.log(a);// 12

2.函数声明和函数调用参数列表:

function func(a,b){ //代码 } func(1,2);

// 参数列表注意点 function a(b=222,c=333) { console.log(b);// 111 console.log(arguments[0]);// 111 } a(111);

3.在循环语句中调用

if(a>1){ //代码 } while(i<len){ //代码 } for(var i=0;i<len;i++){ //代码 }

4.函数声明,函数表达式,立即调用函数

函数声明必须带有标识符,也就是函数名,但是函数表达式方式,标识符带不带都可以。

// 函数声明(会提前) function func(){ // ... } // 函数表达式(不会提前) var func=function(){ // ... }

要区分一个代码是函数声明还是函数表达式,那要看代码的应用上下文。

  • 如果有运算符号,那它就是函数表达式。
  • 如果没有运算符号而且不在条件判断语句中,就说明是函数声明,无法直接加()进行调用(运算符包括赋值号跟括号)
  • 如果在条件语句中,函数声明也会强行被当做函数表达式执行。

所以如果函数被当做函数表达式来进行调用时,this指向始终为window 间接引用

var a = { b:function() { console.log(this) } };

var x = (c=a.b); x();// window

三种自执行函数

(function(){ //代码1 })();

(function(){ //代码2 }());

!function(){ //代码3 }();

上面三个语句都是在运算符相关上下文中,所以都是表达式,就可以强制调用了,下面做一下分析:

1.(function(){})(),(function(){})是一个表达式,会强制其理解成函数直接量方式,也就是表达式方式创建函数,(function(){})它会返回函数对象的引用,最后使用小括号()调用此函数。

2.(function(){}()),如果不用外面包裹的小括号,{}就会理解为复合语句,那么function(){}就被理解为函数声明,但是没有标识符,所以会报错,使用小括号以后,就会变成表达式,也会被理解为直接量方式。

3.!function(){}(),原理同上,!也是一个运算符,所以在原理同上。还可以有其他运算符。

_所以只要通过运算符将语句改成了该表达式,不管这是个什么样的表达式< (,),-,+,_ >,都会先返回函数体的引用,然后再执行其他操作,如进行调用()*

var x = ""; //只要有运算符号,就不会报错 x + function() {console.log(this)}(); x - function() {console.log(this)}(); x * function() {console.log(this)}();

var x = 1; x + function() {return 2;}(); console.log(x);// 1

// 函数体不能直接调用,调用的是函数所在的地址 function (){console.log(123)}();// 报错 function asdfas(){console.log(123)}();// 报错

// 但是如果存在运算符号<(,),-,+,*>则是先忽略执行函数的 () var x = function (){console.log(123)}(); var y = function asdfas(){console.log(123)}();

// 效果类似于先将函数体的地址拿到类似于 var x = function (){console.log(123)};// 拿到了函数体的地址 var y = function asdfas(){console.log(123)};// 拿到了函数体的地址

// 通过地址进行调用 x(); y();

ps:

https://github.com/Kelichao/javascript.basics/issues/19

点赞
收藏
评论区
推荐文章
半臻 半臻
3年前
Python基础5——装饰器
13、装饰器其本质:在不需要做任何代码变动的前提下,增加额外的功能。装饰器返回的是一个函数对象。相当于把函数作为参数传递进去,然后对函数进行装饰其本质就是一个闭包作用:1.给原来的函数增加额外的功能2.把原来的函数作为参数传递进去13.1基本用法标准版的装饰器pythondefwrapper(func):func为原来的函数名defin
LinMeng LinMeng
3年前
call、apply、bind三者为改变this指向的方法。
共同点:第一个参数都为改变this的指针。若第一参数为null/undefined,this默认指向window差异点如下:1.call(无数个参数)第一个参数:改变this指向第二个参数:实参使用之后会自动执行该函数functionfn(a,b,c){console.log(this,abc);//this指
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
LinMeng LinMeng
3年前
js 的 forEach,map,filter,some,every,find(es6),reduce详解
forEach()定义和用法forEach()方法用于调用数组的每个元素,并将元素传递给回调函数注意:forEach()对于空数组是不会执行回调函数的。语法array.forEach(function(currentValue,index,arr),thisValue)参数function(currentValue,index,a
Wesley13 Wesley13
3年前
java重载和重写的区别
一、重载重载方法的规则:1、重载是针对在同一个类中。2、重载方法名一个样。3、参数列表:被重载的方法必须改变参数列表。4、返回类型: 可以改变返回类型。5、修饰符:可以改变修饰符。6、异常:可以声明新的或者更广泛的异常。其中:1.方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时
小嫌 小嫌
2年前
Javascript中的变量提升
定义JavaScript中奇怪的一点是你可以在变量和函数声明之前使用它们。就好像是变量声明和函数声明被提升了代码的顶部一样。sayHi()//Hithere!functionsayHi()console.log('Hithere!')name'JohnDoe'console.log(name)//JohnDoevarn
LinMeng LinMeng
3年前
vue的watch监听
vue的watch监听函数watch用来响应数据的变化,watch的用法大致有以下三种:1.监听某个变量watch:{name(newName,oldName){console.log(newName)//改变前的值console.log(oldName)//改变后的值
Wesley13 Wesley13
3年前
12、ES6形参默认值
当定义函数的时候,可以给参数设置默认值。调用的时候不传递参数值,就使用默认值。例子1:普通函数,不传递参数值。默认全是undefined。functionadd(a,b,c){console.log(a,b,c);}add();//不传递参数是,默认参数值全是undef
Wesley13 Wesley13
3年前
3、python的传入参数
转载:https://blog.csdn.net/abc\_12366/article/details/796272631、位置参数:deffunc(a,b):print(ab)func(1,2)32、默认参数,_默认参数就是在调用函数的时候使用一些包含默认值的参数_