猫史档案馆


【神岛JS教程:闭包】这个变量没定义,却用在函数里面不会报错?这个变量原本不是函数……

用户:蓝矮爱乐蓝矮爱乐查看:2 回复:7 评论:2 创建时间:2022-06-11T21:31:39


在神岛的某些内部脚本定义函数里面

你故意不加括号调用这个函数,却想看看这个函数执行的原理

例如:

//world.say方法可以将文本在地图的世界频道里发送出来,让所有玩家看见
//我就很好奇他的原理啊

~> world.say
<~ (message) => { this._say(0,0,message); }

像上面的代码,this关键词用在箭头函数里面是无效的,很正常。但,this的_say方法是未定义(undefined),怎么调用的?!

其实,你是无法查看this._say的属性,但你可以做出这种样子,怎么做出来的?

因为这个变量只能用在函数里面,看到变量名后往函数外调用,就会报错……

只能用在函数里面的变量叫局部变量,局部变量往函数外调用,就会报错

在函数内定义后,所有作用域都可以使用的叫全局变量

this._say就是用了局部变量导致外部无法调用的方法

这个语法长什么样?很复杂?要用多少关键词?

nonono,别想多了,其实很简单

例:

var variable = (()=>{
    function PowerOfItself(number){//局部函数,函数也同样是变量
        return number**number
    };
    return function variable(a){ return PowerOfItself(a)};//返回一个函数调用,
//这个函数里面返回值的名字就是一个未定义的名字
})()//将variable这个变量赋值于被调用的函数,在这个函数里面创建的变量都是局部变量

这样,就能……

别人: ~> variable
     <~ function variable(a){ return PowerOfItself(a) }

别人:什么?PowerOfItself的原理又是什么?

于是……

别人: ~> PowerOfItself
     <~ "ReferenceError: PowerOfItself is not defined"

别人:这个函数肯定会报错!

我:不信你试试?!

于是……

别人: ~> variable(5)
     <~ 3125

别人:我惊呆了,函数调用后一个未定义的名字调用居然不会报错?!

我:这回你信了吧,我用了闭包方法,让你心服口服

别人:我真的心服口服,闭包怎么用?求解!

我:请看我论坛的最新帖子!

别人:哦,这就去看

 

不喜勿喷()()有什么错误的请指点()()

不要吞排版啊


回复

上一页1 页 / 共 1下一页
FML饭米粒FML饭米粒

虽然没看懂但感觉很nb的亚子呢

 

点赞0


评论


AlcalaAlcala

ddd,原来讨论world.say内部结构的不止我一个()()

点赞0


评论


编码喵编码喵

懂了懂了

点赞0


评论


yee剑走天下yee剑走天下

ddd)(

点赞0


评论


无极玄天无极玄天

不戳不戳

点赞0


评论


芜湖咸鱼芜湖咸鱼

补充:箭头函数(比如()=>{}这种)的this指向父级,而function函数的this是单独的

比如

function sth(){
  this.x = 2;
  const fun1 = ()=>{
    console.log(this.x);  // 这里的this和外部的this一致,因此可以获取到this.x为2
  }
  const fun2 = function(){
    console.log(this.x);  // function函数的this是独立的,和外部没有关系,所以this.x为undefined
  }
  fun1();
  fun2();
}
sth();

点赞0


评论


芜湖咸鱼芜湖咸鱼

this是一个引用(类似指针)比较特殊,建议不要解释为局部变量,和变量的性质差很多

点赞0


评论