本文目錄一覽:
請大神進來解釋一段java script代碼,js代碼
JS引用後就進入內存了,要重載就需要重新運行一次,內存中要去掉,則要做相應的清除
一段JS代碼,能不能請大神幫我分析一下是什麼意思
你好,不知道你是想讓大家幫你解釋代碼呢,還是想找人幫你分析最後console出來的結果。索性我就都幫你解答一下吧。
首先,我們來看一下代碼解釋:
// 聲明一個全局變量name,並給name賦值為window字符串
var name = “window”;
/**
* 定義一個名為func的函數
* 從後面的使用方式來看,這是一個構造函數
*/
function func() {
// 為構造函數聲明一個成員變量name
// 並給成員變量name賦值為func字符串
this.name = “func”;
// 為構造函數聲明一個成員方法method
this.method = function() {
// 調用【Window對象內置的】setTimeout方法
setTimeout(function() {
// 關鍵在與此處的this為什麼指向的是Window??
console.log(this.name);
}, 0);
};
}
// 創建一個func的實例對象,並調用它的method方法
new func().method();
接着,我們來分析一下運行結果。
第一點,搞清楚一個問題。在瀏覽器中聲明一個全局變量,會默認作為Window對象的屬性。所以,當執行完’var name = “window”;’之後,便有了’window.name = “window”‘;可如下驗證:
var name = ‘new name’;
console.log(window.name); // new name
第二點,Javascript程序中,在沒有通過call、apply等方法人為控制的情況下,this指向的是被調用的方法所屬的對象。如題:method方法被調用的時候,method內部的this指向的應該是被new出來的實例對象,驗證方法:
function func() {
this.method = function() {
console.log(this === instanceObj);
}
}
var instanceObj = new func();
instanceObj.method(); // true
第三點,為什麼題述代碼console出來的是”window”,而不是”func”?我們先看setTimeout方法是一個全局方法,即:setTimeout === window.setTimeout。因此setTimeout所屬的對象應該是window。再根據第二條的結論,setTimeout內部的this指向的應該是window對象,那麼結論就顯而易見了:因為window.name = “window”,所以最終打印出來的就是”window”了。
希望我講得夠清楚了,如有疑問可追問,望採納~
請大神幫忙 給解釋下一段JS代碼???
/**
* SendCode Plugin
*/
//發送驗證碼插件開始
//匿名函數執行
!function () {
“use strict”;//要求嚴格語法
//聲明SendCode對象並初始化參數
function SendCode (element, options) {
this.$btn = $(element);//獲取按鈕元素
//合併多個參數 初始化參數(用於外部傳遞參數覆蓋默認參數)
this.options = $.extend({}, SendCode.DEFAULTS, options || {});
}
//控件開放的參數默認值
SendCode.DEFAULTS = {
run: false, // 是否自動倒計時
secs: 60, // 倒計時時長(秒)
disClass: ”, // 禁用按鈕樣式
runStr: ‘{%s}秒後重新獲取’, // 倒計時顯示文本
resetStr: ‘重新獲取驗證碼’ // 倒計時結束後按鈕顯示文本
};
//全局計時器變量,清除用
SendCode.timer = null;
/**
* 開始倒計時
*/
SendCode.prototype.start = function () {
var _this = this,
options = _this.options,
secs = options.secs;
_this.$btn.html(_this.getStr(secs)).css(‘pointer-events’, ‘none’).addClass(options.disClass);
_this.timer = setInterval(function () {
secs–;
_this.$btn.html(_this.getStr(secs));
if (secs = 0) {
_this.resetBtn();
clearInterval(_this.timer);
}
}, 1000);
};
/**
* 獲取倒計時顯示文本
* @param secs
* @returns {string}
*/
SendCode.prototype.getStr = function (secs) {
return this.options.runStr.replace(/\{([^{]*?)%s(.*?)\}/g, secs);
};
/**
* 重置按鈕
*/
SendCode.prototype.resetBtn = function () {
var _this = this,
options = _this.options;
_this.$btn.html(options.resetStr).css(‘pointer-events’, ‘auto’).removeClass(options.disClass);
};
//jQuery 插件擴展方法
function Plugin (option) {
/*主要用於控件二次調用,比如$(‘div’).sendCode(‘getStr ‘,120); 這個時候,第一個參數只是方法名,第二個參數才是option,所以,下面這句代碼的意義就是取到第二個參數。其實就是變相將sendcode內部方法外露出去
*/
var args = Array.prototype.slice.call(arguments, 1);
/*留意最下面一行代碼,$.fn.sendCode = Plugin;此代碼的意義是在jQuery控件庫擴展了一個叫sendCode的控件,調用方法為$(‘div’).sendCode({secs:120}); 那麼此時Plugin
的內置對象this為$(‘div’)是一個數組,所以要循環生成控件。這樣做法是為了滿足調用方在頁面上一次生成多個控件。
*/
return this.each(function () {
var $this = $(this),//單個元素
sendcode = $this.data(‘ydui.sendcode’);//獲取保存在元素上的SendCode對象
//如果元素上沒有保存過對象,那麼初始化SendCode對象並保存到元素上
if (!sendcode) {
$this.data(‘ydui.sendcode’, (sendcode = new SendCode(this, option)));
//如果option參數是對象,那麼直接啟動控件
if (typeof option == ‘object’ option.run) {
sendcode.start();
}
}
//這裡就是上面說的二次調用,$(‘div’).sendCode(‘run’);這個時候的option=’run’
if (typeof option == ‘string’) {
sendcode[option] sendcode[option].apply(sendcode, args);
}
});
}
//將控件擴展到jQuery
$.fn.sendCode = Plugin;
}();
這個就是發送驗證碼時,按鈕文本變化的一個小控件,核心代碼已添加註釋,有問題再聯繫,望採納。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254545.html