从来没写过博客,一来是因为我这个人文笔太差了,写些短东西还行,写的长了文思就枯竭不知道该怎么继续往下写了,而是平时研究的问题都比较零散,真不知道该怎么在博客里记录下来。一般都是记在笔记本里,习惯了手写的感觉。\(^o^)/~
今天群里讨论一个关于js的问题,截图如下:
验证的结果在图中都有显示,群里有个哥们说是自动加上private修饰符的关系,感觉说的不怎么对。所以又研究了下,顺便把相关知识点在巩固一下。
其实上面的问题牵涉到的事javascript的作用域链的东西,网上有很多关于作用域链的文章,在这里又不浪费时间了。首先说一个技巧吧,在作用域链中,有[[scope]],scope chain,还有活动对象等一大堆东西,想理解这些东西还要在画个图出来才能让人理解明白,感觉太抽象了。有一个比较直观的方法可以直观的查看作用域。在chrome中,F12把调试工具调出来,设置一个断点,先进入调试状态再说。上图啦:
F11走着,进入函数内部以后右侧会显示相应的一些东西,关于叫什么东西俺也不是特别清楚。还是上图说话比较直观。先上图再说:
看到了吧,就中间那个Scope Variable,就是scope里的变量啦!看到下面的有Local、Closure还有Global。看起来有没有感觉呀?跟作用域链是不是很像呀!如果继续F11调试的话,跳到另外的函数内部,相应的变量也就发生了变化。可以通过Scope Variable来查看作用域的相关信息。
现在还是来看看最上面提到的这个JS问题。在Foo()这个函数里定义了暂且说是三个函数吧。_pc()、bar()和bar2(),先来看看_pc(),这个是一个闭包,引用了外部函数的变量a,只能在定义它的Foo()这个函数里来调用,所以外部调用是会报错的。第二个bar()函数是一个定义式的函数,而且变量bar没有var修饰,所以成为一个全局变量的函数,直接调用bar()或者window.bar();在bar()函数的作用域中this指向window,而非Foo。第三个就是定义在Foo()里的变量bar2()了,它的作用域也称为局部变量作用域。所以可以通过obj.bar2();来调用。其实只要细心从函数的变量作用域和作用域链来分析,一切都会很明朗的。
写这篇博客只是为了记录自己学习过的一些知识,以前也看,但是过一段时间就忘了,所以记录一下以便以后翻阅。学习javascript的时间也不是很长,所以有很多问题还不是很懂,希望朋友指出错误,共同学习,谢谢!