、これは、実際には、類似した大人であります
このといえば、JSのこの大規模な調査では、我々は、JavaScriptでは、現在の行動に代わって、この執行剤の機能で、環境(エリア)のコンテキストに代わって現在の動作を実行。
北の神の男性は、Liビーズが食べるような、これらの言葉は、次の意味を表しています
神 - >>体(本)
食べる - >>ファンクション(機能)
北根拠ビーズ - >>環境(コンテキスト)
- >>説明:食べる関数は、男性の主な機能は、神である、北朝鮮は、被写体が必ずしもコンテキストにリンクされていない現在の行動管理ビーズ実行環境(コンテキスト)で、ボディのみの機能と関係を持って、神が食べる場合、常に神の主な男になります。このアクションを、食べることができ、実際に、環境が変化しています。
- >> 結論:事実上の缶を説明する、これは、関数が定義され、任意関係なく実行される場合、誰を指します。
第二に、この関数は、これをどのように区別するために
図1に示すように、関数は、実行された機能名の前にあるかどうかを確認する最初なので、これは誰が誰の前にある「」。「」;いいえ、これはウィンドウです
//の例
console.log(この);
機能食べます(){
console.log(この); // this->ウィンドウ
}
〜関数(){
食べる(); // this->ウィンドウ
}();
ジカルボン酸の例//
関数fn(){
console.log(この);
}
VAR OBJ = {FN:FN}。
FN(); // this->ウィンドウ
obj.fn()// this-> OBJ
//例3
関数sum(){
FN();
}
和(); // this->ウィンドウ
//例4
たOO = {
合計:関数(){
console.log(この);
FN();
}
}
oo.sum(); //最初の和関数内の、この第1の出力はオブジェクト指向であるのFn()を実行した後、このウィンドウは
2、すぐにこのウィンドウの機能は常に実行
(関数() { console.log(この); // this->ウィンドウ })()
図3は、イベントがトリガされた特定のイベント要素の結合方法に、対応する実行方法は、この方法は、現在の要素であります
関数fn(){
console.log(この);
}
//の例
。のdocument.getElementById( "DIV1")のonclick = FN。//この - > DOM元素
ジカルボン酸の例//
document.getElementById( "DIV1")。onclickの=関数(){
console.log(この); //この - >#DIV
FN(); // this->ウィンドウ
}
結論:関数は、少し行っ見つけるために、これは何かの前にあり、これは、ウィンドウはポイントではありません
第三に、この分析の使用フェース質問
VAR NUM = 20; VAR OBJ = { A:30 FN:(関数(NUM){ this.num * = 3; A + = 15。 そこNUM = 45; 復帰機能(){ this.num * = 4; A + = 20。 console.log(NUM)。 } }) }。 VARは、fn = obj.fn。 FN(); // - > 65 obj.fn(); // ->85 console.log(window.num, obj.num) // ->240, 120
上面代码使用堆栈图来描述,如下,首先正方形代表栈内存(函数执行环境,context),圆边方形代表堆内存(用来存放字符串)。
第一步,形成一个js执行环境,window作用域,首先预解释(声明var,声明+定义function);
第二步,代码由上往下执行,num = 20, obj = 引用数据类型(数据存在堆内存里面)
第三步,因为obj.fn是立即执行函数,所以形成一个私有作用域A,执行fn里面的函数,因为fn里面的函数返回值为function,return值被外面的obj.fn引用了,这个立即执行函数A作用域不销毁。
第四步,window作用域下面的代码继续往下执行。
四、this实践运用
现在有这样一个需求,要求做一个累加器,每点击一次,就累加1。
var oBtn = document.getElementById("btn");
var spanNum = document.getElementById("spanNum");
// 方法一
// 利用全局作用域不销毁的原理,把需要累加的数字定义为全局变量
var count = 0;
oBtn.onclikc = function() {
count++;
spanNuM.innerText = count;
}
// 弊端:在项目中为了防止全局变量之间的冲突,我们一般是禁止或者减少使用全局变量的
// 方法二
// 形成一个不销毁的私有作用域保存我们需要累积的数据
// 1)
(function() {
var count = 0;
oBtn.onclick = function() {
++count;
spanNum.innerText = count;
}
})
// 2)
oBtn.onclick = (function() {
var count = 0;
return function() {
++count;
spanNum.innerText = count;
}
})
// 上面的两种写法都是表达同一个意思
// 弊端:有一个不销毁的私有作用域,占那么一点点内存
// 方法三
// 利用innerHTML的方式处理,每点击一次都需要到页面获取最新的值,然后累加,最后把结果放进去
oBtn.onclick = function() {
++spanNum.innerHTML;
}
// 弊端:innerHTML获取的时候本来就需要浏览器去处理,每一次都需要把页面的内存先转化为字符串,然后累加,累加完重新添加回去,当重新添加的时候浏览器需要重现渲染一遍页面。
// 方法四
// 利用自定义属性存储(推荐!)
oBtn.count = 0;
oBtn.onclick = function() {
spanNum.innerTxt = ++this.count;
}
//注意,这里的count只是对象的一个属性,它既不是全局变量,也不是局部变量哦。
END