前端逼死強迫癥系列之javascript續集
阿新 • • 發佈:2017-07-12
普通 target sogo prototype 所有 string encodeuri java 常用
一、javascript函數
1.普通函數
function func(){
}
2.匿名函數
setInterval(function(){
console.log(123);
},5000)
3.自執行函數
多數情況下可能會引入別人的js,如果別人的js函數重復,會導致一個不能用,為了避免這個問題,把內部所有的功能放到函數裏面。做成一個嵌套函數。
但是如果外面的函數名也有重復,怎麽處理,就外邊的函數沒有名字,並且自動執行一下。
自執行函數怎麽寫呢?
// ()():第一個括號function,第二個括號傳實參。創建函數,並且自動執行 (function(arg){ console.log(arg); })(1)
二、javascript序列化及轉義
- 常用的序列化操作
li = [11,22,33,44]
s = JSON.stringify(li) // 把對象轉化為字符串
newL = JSON.parse(s) // 把字符串轉化為對象
- 轉義
比如網上搜一個東西,網址自動變成了%等一些內容
> url = "https://www.sogou.com/web?query=時間" < "https://www.sogou.com/web?query=時間" > newUrl = encodeURI(url) // 轉義 < "https://www.sogou.com/web?query=%E6%97%B6%E9%97%B4" > decodeURI(newUrl) // 轉回原格式 < "https://www.sogou.com/web?query=時間" > newUrl = encodeURIComponent(url) // 全部轉義 < "https%3A%2F%2Fwww.sogou.com%2Fweb%3Fquery%3D%E6%97%B6%E9%97%B4"
默認http請求不是長鏈接,連一次就斷了,但是網站有保持登錄一個月,怎麽實現的。
一般登錄成功後,網站會給你發一段字符串過來,把它保存在硬盤的某個地方。這就是cookie。
客戶端(cookie) =》 服務器端 。 將數據經過轉義後,保存在cookie
escape( ) // 對字符串轉義
unescape( ) // 給轉義字符串解碼
URIError // 由URl的編碼和解碼方法拋出
三、eval以及時間操作
- eval
在Python中:
val = eval(" 1+1 ") # 表達式
exec(" 執行代碼 ") # 比如for循環。但exec只是執行,沒有返回值
在JavaScript中:
eval :功能是python裏eval和exec的合集
- 時間操作
> d = new Date()
Mon Nov 28 2016 22:46:33 GMT+0800 (中國標準時間)
> d.getMinutes()
46
> n = d.getMinutes() + 12
58
> d.setMinutes(n)
1480345113329
> d
Mon Nov 28 2016 22:58:33 GMT+0800 (中國標準時間)
// Date類
// var d = new Date() 當前時間
// d.getXXX 獲取
// d.setXXX 設置
四、javascript作用域
1.javascript以函數作為作用域(let除外)
- java、c、c# 等語言是以“{}”代碼塊 作為作用域的。
- Python中:作用域是以函數作為作用域的。
- JavaScript:也是以函數作為作用域的
2.函數的作用域在函數未被調用之前,已經創建
3.函數的作用域存在作用域鏈,並且也是在被調用之前創建
作用域鏈:嵌套函數,作用域一層套一層
以下三個示例,分別會輸出什麽?
// 示例一:
xo = "alex";
function func(){
// var xo = ‘eric‘;
function inner(){
// var xo = ‘tony‘;
console.log(xo);
}
inner()
}
func()
// 示例二:
xo = "alex";
function func(){
var xo = ‘eric‘;
function inner(){
console.log(xo);
}
return inner;
}
var ret = func()
ret()
// 示例三:
xo = "alex";
function func(){
var xo = ‘eric‘;
function inner(){
console.log(xo);
}
var xo = ‘tony‘;
return inner;
}
var ret = func()
ret()
// 註:瀏覽器console中換行,使用shift+回車
函數的作用域存在作用域鏈,並且也是在被調用之前創建
4.函數內部變量 聲明提前
// 示例一:
function func(){
console.log(xxoo);
}
func();
// 程序直接報錯
function func(){
console.log(xxoo);
var xxoo = ‘alex‘;
}
// 解釋過程中:var xxoo;
func();
// undefined
未賦值變量,提前聲明為 undefined
> var fgf
undefined
> fgf
undefined
五、javascript面向對象
- this代指對象(python self)
- 創建對象時, new 函數名()
function Foo(n){
this.name = n;
this.sayName = function(){
console.log(this.name);
}
}
var obj1 = new Foo(‘we‘);
obj1.name
obj1.sayName()
var obj2 = new Foo(‘wee‘);
obj2.name
obj2.sayName()
上面那麽寫可以,但是有個問題,裏面有些內容被重復定義了,sayName這個方法在每個對象裏都被重復定義了一次。
- Python的面向對象:方法保存在類內存中
class Foo:
def __init__(self,name):
self.name = name
def sayName(self):
print(self.name)
obj1 = Foo(‘we‘)
obj2 = Foo(‘wee‘)
- JavaScript面向對象 —> 原型:
原型:避免浪費內存資源
function Foo(n){
this.name = n;
}
// Foo的原型
Foo.prototype = {
‘sayName‘: function(){
console.log(this.name)
}
}
obj1 = new Foo(‘we‘);
obj1.sayName()
obj2 = new Foo(‘wee‘);
六、javascript 詞法分析解析
如下代碼,分別會對應輸出什麽?
function t1(age){
console.log(age); // function age()
var age = 27;
console.log(age); // 27
function age(){} // 執行時,因為沒有調用,所以執行時不考慮
console.log(age); // 27
}
t1(3);
active object ——> 簡稱AO
1. 形式參數
2. 局部變量
3. 函數聲明表達式(優先級比較高)
下面開始分析:
- 形式參數:
AO.age = 3; - 局部變量:
AO.age = 27; - 函數聲明表達式
AO.age = function()
作用域值的分析,也可以通過詞法分析,去分析
前端逼死強迫癥系列之javascript續集