Tôi đang tìm kiếm một kỹ thuật tốt để thoát khỏi những gì tôi muốn làm: để thiết lập một biến toàn cầu.
Lần đầu tiên ai đó chạy chức năng bằng cách nhấp vào nút, nó kích hoạt chức năng ban đầu để biến một vài thứ thành Draggables. Sau đó, nếu họ nhấp vào nút lần thứ hai, tôi muốn xác định xem chức năng init
có được khởi tạo hay không và nếu không để không gọi nó nữa. Tôi có thể dễ dàng thực hiện điều này bằng cách đặt một biến toàn cầu từ hàm init
và sau đó kiểm tra biến đó từ chức năng nhấp chuột, nhưng tôi tự hỏi làm thế nào để thực hiện việc này mà không cần đặt biến toàn cầu. Tôi thực sự muốn một ví dụ về một cách để làm điều này.
hỏi ngày 2 tháng 7 năm 2012 lúc 19:27Jul 2, 2012 at 19:27
Bạn có thể thêm một thuộc tính vào chức năng:
function init[] {
init.called = true;
}
init[];
if[init.called] {
//stuff
}
Đã trả lời ngày 2 tháng 7 năm 2012 lúc 19:29Jul 2, 2012 at 19:29
Levi Hackwithlevi HackwithLevi Hackwith
9.17217 Huy hiệu vàng63 Huy hiệu bạc114 Huy hiệu đồng17 gold badges63 silver badges114 bronze badges
Trong khi câu trả lời của @Levi nên hoạt động tốt, tôi muốn trình bày một lựa chọn khác. Bạn sẽ viết quá mức chức năng init để không làm gì một khi nó đã được gọi.
var init = function [] {
// do the initializing
init = function[] {
return false;
}
};
Hàm khi được gọi là lần đầu tiên sẽ thực hiện init. Sau đó, nó sẽ ngay lập tức ghi đè lên chính nó để trả lại sai vào lần tới khi nó được gọi. Lần thứ hai hàm được gọi, cơ thể hàm sẽ chỉ chứa Return False.
Để đọc thêm: //www.ericfeminella.com/blog/2011/11/19/function-overwriting-in-javascript/
Benmorel
32,8K48 Huy hiệu vàng170 Huy hiệu bạc303 Huy hiệu đồng48 gold badges170 silver badges303 bronze badges
Đã trả lời ngày 2 tháng 7 năm 2012 lúc 19:37Jul 2, 2012 at 19:37
Amith Georgeamith GeorgeAmith George
5.7882 Huy hiệu vàng33 Huy hiệu bạc52 Huy hiệu Đồng2 gold badges33 silver badges52 bronze badges
1
Tại sao bạn không kiểm tra xem các chất kéo của bạn có lớp draggable
trên chúng không?
if [$['.mydiv'].is['.draggable']] {
//do something
}
Đã trả lời ngày 2 tháng 7 năm 2012 lúc 19:31Jul 2, 2012 at 19:31
JasonjasonJason
50,5K37 Huy hiệu vàng128 Huy hiệu bạc185 Huy hiệu đồng37 gold badges128 silver badges185 bronze badges
4
Function.prototype.fired = false;
function myfunc[] {
myfunc.fired = true;
// your stuff
};
console.log[myfunc.fired] // false
myfunc[];
console.log[myfunc.fired] // true
Đã trả lời ngày 4 tháng 4 năm 2014 lúc 2:19Apr 4, 2014 at 2:19
Những gì bạn có thể làm là tháo chức năng init từ nguyên mẫu.
var Obj = function [] {
this.init = function [] {
document.write["init called
"];
this.init = null;
}
}
var o = new Obj[];
if [o.init] document.write["exists!
"];
o.init[];
if [o.init] document.write["exists!
"];
o.init[];
var init = function [] {
// do the initializing
init = function[] {
return false;
}
};
0 đầu tiên sẽ đúng và in var init = function [] {
// do the initializing
init = function[] {
return false;
}
};
1 nhưng vì chức năng tự xóa, ____10 thứ hai sẽ thất bại. Trong ví dụ của tôi, tôi gọi lần thứ hai là Init điều kiện chỉ để cho thấy rằng sẽ không có gì xảy ra, nhưng tất nhiên bạn chỉ có thể gọi nó nếu nó tồn tại:if [o.init] o.init[];
//jsfiddle.net/coreyog/Wd3Q2/
Đã trả lời ngày 2 tháng 7 năm 2012 lúc 19:55Jul 2, 2012 at 19:55
Corey OgburnCorey OgburnCorey Ogburn
23.3K30 Huy hiệu vàng111 Huy hiệu bạc183 Huy hiệu đồng30 gold badges111 silver badges183 bronze badges
2
Cách tiếp cận chính xác là sử dụng API proxy JavaScript để bẫy các cuộc gọi chức năng bằng trình xử lý
var init = function [] {
// do the initializing
init = function[] {
return false;
}
};
3.const initFun = [args] => {
console.log['args', args];
}
const init = new Proxy[initFun, {
apply[target, thisArg, args]{
target.calls = target.calls ? target.calls + 1 : 1;
return target.apply[thisArg, args];
}
}];
init['hi'];
console.log[init.calls]; // 1
init['hello'];
console.log[init.calls]; // 2
Đã trả lời ngày 10 tháng 6 năm 2020 lúc 5:32Jun 10, 2020 at 5:32
Ahmadalibalochahmadalibalochahmadalibaloch
5.6612 Huy hiệu vàng46 Huy hiệu bạc56 Huy hiệu Đồng2 gold badges46 silver badges56 bronze badges