首页 > 编程语言 >javascrpt的函数细节,匿名函数

javascrpt的函数细节,匿名函数

时间:2022-09-19 10:37:51浏览次数:72  
标签:function console 函数 作用域 javascrpt 匿名 20 log

正常函数:

function a (i,j){

  return i+j;

}

 

匿名函数:建议在最外面加上一对圆括号,目的是把函数当成表达式

(function (i,j){

  return i + j

})  //只完成了定义,没有调用它

 

匿名函数调用

(function (i,j){

  return i + j

})(1,2)  //那么匿名函数没有函数名,怎么调用呢,后面加上圆括号直接传参调用

 

匿名函数还可以作为其他对象的函数:

doucument.getElementById("ID").onclick = (function (){ console.log('你点击了我!');});

匿名函数简化写法:箭头函数

(参数) => {

  return 结果;

}

如果只有一个参数,那么()可以省略:

参数1 =>{

  return 结果;

}

 

如果函数体内只有一行代码,那么{} 可以省略:

doucument.getElementById("ID").onclick = (参数1) => consle.log('你点击了我!');

javascript中的函数本质上是一个对象,所以可以做赋值操作:

doucument.getElementById("ID").onclick = 函数名或者函数体定义

对象有属性,有方法,可以作为参数传递,可以是另外函数的返回值,非常灵活!

使用 console.dir(函数名),可以看到函数(即对象)内部定义的属性和方法

作为方法参数传递:

function a(){
  console.log()
}

function b(fn){
  console.log();
  fn(); // 既然fn是从外面传递进来的一个函数对象,那么加上()就可以直接调用它
}

b(a);

可以作为函数返回值:

function c(){
  console.log("c");
  function d(){
     console.log("d");     
  }
  return d;  //返回d的对象定义,并不是返回d的执行结果,所以不会打印d  
}

c()(); //既然返回的是函数定义,那么再加一个()即是调用d函数

函数的作用域:

如果用console.dir(函数名),可以输出函数中的内置属性(js中的函数被当成对象看待),其中用[[....]]双中括号标识的是内置属性,不能调用但是可以查看[[Scopes]]代表的就是该函数的作用域,这里不显示函数体内的作用域,只显示父和全局级的作用域,如下图:closure(a){y:20}就是父作用域,而Global就代表全局作用域,这两个作用域都是函数可以读取的。

 函数的闭包:闭包就是指函数可以访问自己的作用域中的变量,即使函数被传递到别的地方,也依然可以访问,因为函数在定义的时候作用域已经确定了,如上所述可以查看作用域,那么下图闭包可以正常打印x,y的值吗?答案是可以。

 

 let和var作用域:

如果函数外层引用的是let变量,那么外层普通的{}也会作为作用域边界,最外层的let 也占一个script作用域

let x=10;

if(true){
     let y = 20;
     function(){
          console.log(x,y)

     }   
        
      console.dir(b);
}

 

如上图:红色框的是自己的作用域,不在讨论之列;

绿框的是Block作用域,界定的关键是{},y=20;

蓝框的是script作用域,x=10

最后黄色框的是Global全局作用域

dir()打印如下图:

 

 如果同样的代码,换成var声明,那么只有Global作用域了,蓝框显示,XY都属于Global作用域,也就是说如果换var声明,那么外层普通的{}不会视为边界

 

 查看该函数作用域,如下图

 

代码 如下:

// 案例1:

var e=10;
if(true){
   var e=20; //与外面的e视为同一个作用域的同一个变量,20将替代10赋值
   console.log(e);   //输出20 
}
console.log(e); //输出20

// 案例2:

let e=10;
if(true){ //{}被视为作用域边界
   let e=20; //用let声明,与外面的e不是同一个变量
   console.log(e);   //输出20 
}
console.log(e); //输出10

// 案例3:如果用var要把里、外的作用域分开,那么就需要使用到函数
var e=10;
if(true){
  function b(){
     var e=20; 
     console.log(e);   //输出20 
  }
  b();
}
console.log(e); //输出10


 

标签:function,console,函数,作用域,javascrpt,匿名,20,log
From: https://www.cnblogs.com/tangwei-fuzhou/p/16706837.html

相关文章

  • C++11 -- 匿名函数(lambda 表达式)
    0.一道题目引入关于sb力扣定义外部函数和变量报错这件事最初我定义了一个\(cmp\)函数用来对\(vector\)排序,和一个全局变量\(unordered\_map\)用来记录元素个数......
  • KMP&Z函数详解
    KMP一些简单的定义:真前缀:不是整个字符串的前缀真后缀:不是整个字符串的后缀当然不可能这么简单的,来个重要的定义前缀函数:给定一个长度为\(n\)的字符串\(s\),其\(前......
  • 【java8新特性】02:常见的函数式接口
    Jdk8提供的函数式接口都在java.util.function包下,Jdk8的函数式类型的接口都有@FunctionInterface注解所标注,但实际上即使没有该注解标注的有且只有一个抽象方法的接口,都可......
  • scanf函数格式输入,限制以及跳过某些输入
    在scanf中%3指的是为333,必须在读入时指定a的读入宽度为3,b的读入宽度为3,且a和b的控制字符之间必须额外增加%*控制符,用于跳过间的三位输入数字,选项A正确;本题答案#inclu......
  • javascript中的一些细节,undefined和null的区别,什么情况下是false,函数赋值,等等
    如果不赋值,就使用默认值,page=1,size=10如果赋值按位置赋值,如果要跨越位置赋值size,则page定义为undefined则使用的是默认值如下图:javascript什么情况下是false,什么情况......
  • SQLZOO记录 2:窗口函数
    SQL窗口函数包括LAG、LEAD、RANK和NTILE。这些函数在行的“窗口”上运行——通常是表中某种意义上相邻的行。9-WindowfunctionsShowthelastName,partyandv......
  • 多对一查找四种函数公式
    问题:多对一查找函数解决:{=INDEX(C:C,MATCH(F2&G2,A:A&B:B,))}=XLOOKUP(F2&G2,A:A&B:B,C:C,"查无此妖")=FILTER(C$1:C$7,(A$1:A$7=F2)*(B$1:B$7=G2),"查无此妖")=SUMI......
  • 9.2.2 信号函数signal详解
    信号处理函数的定义为:voidsignal_handler(intsignum)可以理解为:参数为int型,返回值为void型的函数;信号函数signal()定义如下:void(*signal(intsignum,void(*ha......
  • 【Azure 应用服务】Azure Durable Function(持久函数)在执行Activity Function时候,因
    问题描述在使用AzureDurableFunction函数,调用函数链模式来调用多个ActivityFunction。函数链:https://docs.azure.cn/zh-cn/azure-functions/durable/durable-function......
  • 【java8新特性】01:函数式编程及Lambda入门
    我们首先需要先了解什么是函数式编程、函数式编程是一种结构化编程范式、类似于数学函数、它关注的重点在于数据操作、或者说它所提倡的思想是做什么,而不是如何去做。自J......