Javascript 作用域
萬(wàn)載ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!一般語(yǔ)言的作用域分兩大種
1. 以代碼塊為作用域
2. 以函數(shù)作為作用域
相對(duì)于其他的語(yǔ)言的作用域以代碼塊為作用域
例如 JAVA
public void Func(string v){ if (1==1){ string name='Java'; } console.writeline(name); }
如上就會(huì)報(bào)錯(cuò):因?yàn)槭且砸粋€(gè)代碼塊為作用域
Python : 以函數(shù)作為作用域
def func(): if 1==: name='alex' print(name) func()
一:以函數(shù)作為作用域(除去let)
那么JavaScript 是以什么為作用域呢?
答案是以函數(shù)作為作用域
例如:
xo="liang"; function func(){ var xo='eric'; function inner(){ console.log(xo); } return inner; } var ret=func() ret()
執(zhí)行的結(jié)果為eric
那么為什么會(huì)執(zhí)行的為eric 首先是解析func 函數(shù)中的代碼。執(zhí)行到function inner 就不會(huì)執(zhí)行了
就會(huì)跳到下return inner 其實(shí)ret 就是inner 的內(nèi)存對(duì)象而已了。加了一個(gè)()之后就會(huì)執(zhí)行inner 這個(gè)函數(shù)體
再來一個(gè)例子:
xo="liang"; function func(){ var xo='eric'; function inner(){ console.log(xo); } xo='tony'; return inner; } var ret=func() ret()
執(zhí)行的結(jié)果是tony 這個(gè)是為什么呢?
首先我們看看代碼 xo 的是賦值了兩次。代碼是遵循這一條條解析的。到了第二次賦值的時(shí)候,xo已經(jīng)變?yōu)?tony
那么后面再去執(zhí)行inner 這個(gè)函數(shù)的時(shí)候執(zhí)行的結(jié)果就是tony 其實(shí)可以改一下代碼,就看的更清晰了如下:
xo="liang"; function func(){ var xo='eric'; var xo='tony'; function inner(){ console.log(xo); } return inner; } var ret=func() ret()
改成這個(gè)樣子之后就更清晰了,
總結(jié)一下 就是函數(shù)的作用域 未被調(diào)用之前 已經(jīng)創(chuàng)建了
還有一個(gè)是函數(shù)的做用鏈 比如:
function func(){ function inner(){ }}
其實(shí)在調(diào)用之前是已經(jīng)創(chuàng)建好了的作用鏈 也就是多層函數(shù)嵌套
4.函數(shù)內(nèi)局部變量提前聲明
function func(){ console.log(xxoo); }
執(zhí)行這個(gè)時(shí)候就會(huì)報(bào)錯(cuò)
function func(){ console.log(xxoo); var xxoo='print'; }
但是執(zhí)行這個(gè)時(shí)候就不會(huì)。因?yàn)槟J(rèn)函數(shù)內(nèi)的局部變量就會(huì)聲明一個(gè)undefined
就是說,在調(diào)用之前,xxxx=undefined 執(zhí)行 console.log(xxoo); 的時(shí)候就會(huì)輸出一個(gè)undefined
JavaScript 面向?qū)ο?/p>
這個(gè)其實(shí)是很有意思的
function foo(){ var x='liang'; } fucntion Foo(n){ this.name=n; } var obj = new Foo('we'); obj.name
比如上面的一個(gè)代碼。this就相當(dāng)于python中的self
一、this 代指對(duì)象(python self) 二、創(chuàng)建對(duì)象時(shí)、new 函數(shù)()
如果面向?qū)ο笾?foo 函數(shù)中還需要嵌套一個(gè)函數(shù)呢? 那么嘗試一下吧
function Foo(n){ this.name=n; this.sayName=function(){ console.log(this.name); } } var obj1=new Foo('we'); obj.name obj.sayName()
上面寫一個(gè)一個(gè)sayName 但是我對(duì)比了一下python 的一個(gè)面向?qū)ο蟮臅r(shí)候才發(fā)現(xiàn)這種是不合理的
如果我有50個(gè)對(duì)象。那么這個(gè)
function(){ console.log(this.name);
這個(gè)代碼就會(huì)在每一個(gè)對(duì)象里面進(jìn)行創(chuàng)建。而python 是這個(gè)函數(shù)就放在類里面的。
例如這樣的
class School(object): def __init__(self,name,addr): self.name=name self.addr=addr self.students=[] self.teachers=[] def ronle(self,stu_ojb): print("為學(xué)生注冊(cè) %s"%stu_ojb.name) self.students.append(stu_ojb) def hire(self,teac_obj): print("添加新員工%s"%teac_obj.name) self.teachers.append(teac_obj) t1=Teache("liang",22,'F',12000,"Linux") t2=Teache("liang2",22,'F',12000,"Python"
我的t1 和t2 只需要去類里面去找 hire 這個(gè)方法。而不是去自己里面去定義這個(gè)方法
那么這個(gè)就引出了面向?qū)ο罄锩娴脑停?/p>
那么解決的方法如下:
原型: function Foo(n){ this.name=n; } // Foo 的原型 Foo,prototype={ 'sayName':function(){ console.log(this.name) } } obj1=new Foo('we'); obj.sayName() obj2=new Foo('wee');
這樣就可以直接去類里面去找方法了,不需要在自己定義了。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。