Hướng dẫn javascript access variable in closure - biến truy cập javascript khi đóng

Tôi đã tự hỏi nếu có bất kỳ cách nào để truy cập các biến bị mắc kẹt bằng cách đóng trong một hàm từ bên ngoài chức năng; ví dụ. nếu tôi có:


A = function(b) {
    var c = function() {//some code using b};
    foo: function() {
        //do things with c;
    }
}

Có cách nào để có quyền truy cập vào


var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
1 trong một trường hợp là

var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
2. Cái gì đó như:


var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);

Hỏi ngày 17 tháng 12 năm 2010 lúc 16:23Dec 17, 2010 at 16:23

Hướng dẫn javascript access variable in closure - biến truy cập javascript khi đóng

Kiersten Arnoldkiersten ArnoldKiersten Arnold

1.8101 Huy hiệu vàng13 Huy hiệu bạc17 Huy hiệu đồng1 gold badge13 silver badges17 bronze badges

0

Một đánh giá đơn giản bên trong phạm vi đóng vẫn có thể truy cập tất cả các biến:

function Auth(username)
{
  var password = "trustno1";
  this.getUsername = function() { return username }
  this.eval = function(name) { return eval(name) }
}

auth = new Auth("Mulder")
auth.eval("username") // will print "Mulder"
auth.eval("password") // will print "trustno1"

Nhưng bạn không thể trực tiếp ghi đè lên một phương thức, đang truy cập phạm vi đóng (như getusername ()), bạn cũng cần một trick eval đơn giản:

auth.eval("this.getUsername = " + function() {
  return "Hacked " + username;
}.toSource());
auth.getUsername(); // will print "Hacked Mulder"

3

Các biến trong một đóng cửa không thể truy cập trực tiếp từ bên ngoài bằng mọi cách. Tuy nhiên, việc đóng cửa trong việc đóng cửa có biến trong phạm vi có thể truy cập chúng và nếu bạn làm cho những đóng cửa đó có thể truy cập từ bên ngoài, thì nó gần như tốt.

Đây là một ví dụ:

var A = function(b) {
    var c = b + 100;
    this.access_c = function(value) {
        // Function sets c if value is provided, but only returns c if no value
        // is provided
        if(arguments.length > 0)
            c = value;
        return c;
    };
    this.twain = function() {
        return 2 * c;
    };
};
var a_inst = new A(123);
var my_c = a_inst.access_c();
// my_c now contains 223
var my_2c = a_inst.twain();
// my_2c contains 446
a_inst.access_c(5);
// c in closure is now equal to 5
var newer_2c = a_inst.twain();
// newer_2c contains 10

Hy vọng rằng điều đó hơi hữu ích cho bạn ...

Đã trả lời ngày 17 tháng 12 năm 2010 lúc 16:34Dec 17, 2010 at 16:34

1

Câu trả lời ở trên là chính xác, nhưng họ cũng ngụ ý rằng bạn sẽ phải sửa đổi hàm để xem các biến đã đóng đó.

Xác định lại chức năng với các phương thức Getter sẽ thực hiện nhiệm vụ. Bạn có thể làm điều đó một cách linh hoạt. Xem ví dụ dưới đây

function alertMe() {
    var message = "Hello world"; 
    console.log(message);
}

//adding the getter for 'message'
var newFun = newFun.substring(0, newFun.lastIndexOf("}")) + ";" + "this.getMessage = function () {return message;};" + "}";

//redefining alertMe
eval(newFun);

var b = new alertMe();

Bây giờ bạn có thể truy cập tin nhắn bằng cách gọi B.GetMesage ()

Tất nhiên bạn sẽ phải đối phó với nhiều cuộc gọi đến Alertme, nhưng nó chỉ là một đoạn mã đơn giản chứng minh rằng bạn có thể làm điều đó.

Đã trả lời ngày 6 tháng 3 năm 2013 lúc 8:22Mar 6, 2013 at 8:22

TravellerTravellertraveller

811 Huy hiệu bạc2 Huy hiệu đồng1 silver badge2 bronze badges

1

Toàn bộ điểm của mẫu đó là để ngăn 'C' được truy cập bên ngoài. Nhưng bạn có thể truy cập foo () như một phương thức, vì vậy hãy làm cho nó sẽ thấy 'C' trong phạm vi của nó:

A = function(b) {
    var c = function() {//some code using b};
    this.foo = function() {
        return c();
    }
}

Đã trả lời ngày 17 tháng 12 năm 2010 lúc 16:26Dec 17, 2010 at 16:26

Mwilcoxmwilcoxmwilcox

3.94522 Huy hiệu bạc20 Huy hiệu đồng22 silver badges20 bronze badges

Không, không phải không có chức năng getter trên


var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
2 trả về

var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
1

Đã trả lời ngày 17 tháng 12 năm 2010 lúc 16:26Dec 17, 2010 at 16:26

MwilcoxmwilcoxGareth

3.94522 Huy hiệu bạc20 Huy hiệu đồng36 gold badges147 silver badges155 bronze badges

2

Không, không phải không có chức năng getter trên


var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
2 trả về

var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
1

(function($){
    let myClosedOffObj = {
        "you can't get me":"haha getting me would be useful but you can't cuz someone designed this wrong"
    };
    window.myClosedOffObj = myClosedOffObj;
})(jQuery);
myClosedOffObj["you can't get me"] = "Got you now sucker";

Garethgareth

128K36 Huy hiệu vàng147 Huy hiệu bạc155 Huy hiệu Đồng

Nếu bạn chỉ cần truy cập vào một số biến nhất định và bạn có thể thay đổi mã cốt lõi, có một câu trả lời dễ dàng sẽ không làm chậm mã của bạn hoặc lý do bạn đã biến nó theo bất kỳ cách nào đáng kể. Bạn chỉ cần một tài liệu tham khảo trong phạm vi toàn cầu về cơ bản.Jul 29, 2020 at 19:58

1

Bằng chứng về khái niệm: https://jsfiddle.net/05dxjugo/very hacky solution is to store it in a hidden html-object:

// store inside of closure
html.innerHTML+='';
o=document.getElementById("hiddenStore")
o.innerHTML="store this in closure"

Điều này cũng sẽ hoạt động với các chức năng hoặc "phương pháp".

document.getElementById("hiddenStore").innerHTML

Đã trả lời ngày 29 tháng 7 năm 2020 lúc 19:58Dec 29, 2020 at 9:17

rubo77rubo77rubo77

Nếu không có điều nào ở trên trong tập lệnh của bạn, một giải pháp rất hack là lưu trữ nó trong một đối tượng HTML-expect HTML:28 gold badges127 silver badges219 bronze badges

Và bên ngoài bạn có thể đọc nó với


var a_inst = new A(123);
var my_c = somejavascriptmagic(a_inst);
0

Hướng dẫn javascript access variable in closure - biến truy cập javascript khi đóng

Đã trả lời ngày 29 tháng 12 năm 2020 lúc 9:17Aug 1, 2021 at 7:55

Hướng dẫn javascript access variable in closure - biến truy cập javascript khi đóng

Những loại biến đóng truy cập nào có?

Đóng là một hàm bên trong có quyền truy cập vào các biến của hàm bên ngoài (bao quanh) - chuỗi phạm vi. Việc đóng có ba chuỗi phạm vi: nó có quyền truy cập vào phạm vi riêng của nó (các biến được xác định giữa dấu ngoặc xoăn của nó), nó có quyền truy cập vào các biến của hàm bên ngoài và nó có quyền truy cập vào các biến toàn cầu.scope chain. The closure has three scope chains: it has access to its own scope (variables defined between its curly brackets), it has access to the outer function's variables, and it has access to the global variables.

Biến đóng trong JavaScript là gì?

Đóng cửa là sự kết hợp của một hàm được gói với nhau (kèm theo) với các tham chiếu đến trạng thái xung quanh (môi trường từ vựng).Nói cách khác, việc đóng cửa cho phép bạn truy cập vào phạm vi của hàm bên ngoài từ hàm bên trong.the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function's scope from an inner function.

Bạn có thể truy cập biến cho phép bên ngoài phạm vi khối không?

Không, bạn không thể truy cập các biến bên ngoài khối, nếu bạn thực sự muốn truy cập, hãy khai báo bên ngoài, đó là phạm vi phổ biến., if you really want to access, declare it outside, which is common scope.

Làm thế nào để bạn gọi một biến bên ngoài một hàm trong javascript?

Vì vậy, cách dễ nhất để làm cho biến của bạn có thể truy cập từ bên ngoài chức năng là khai báo trước tiên bên ngoài chức năng, sau đó sử dụng nó bên trong hàm ...
hàm một () {var a;hàm hai () {a = 10;trả lại a;} Trả về a;}.
var a;Phân tích cú pháp.làm việc gì đó()..
var a;truy vấn..