2010-08-04 34 views
20

Tôi có cảm giác điều này có thể không thực hiện được, nhưng tôi muốn xác định tên biến ban đầu của biến đã được chuyển đến hàm trong javascript. Tôi không biết làm thế nào để giải thích nó tốt hơn thế, vì vậy hãy xem ví dụ này có hợp lý không.Xác định tên gốc của biến sau khi nó được chuyển đến hàm

function getVariableName(unknownVariable){ 
    return unknownVariable.originalName; 
} 

getVariableName(foo); //returns string "foo"; 
getVariableName(bar); //returns string "bar"; 

Đây là một plugin jquery tôi đang làm việc và tôi muốn hiển thị tên của biến được chuyển đến hàm "gỡ lỗi".

+1

Tôi không chắc mục đích của việc này là gì, vì bạn cần phải quan tâm đến các giá trị biến hơn tên biến. –

+2

Không có tên biến nào khi chương trình đang chạy. Không có "hiện tại", và không có "bản gốc". – Tomalak

+1

Haha, tôi nghĩ đây là một cú sút dài nhưng đáng để bắn. Không có quá nhiều mục đích, nhưng nếu bạn muốn ngữ cảnh, bạn có thể xem phiên bản hiện tại của plugin: http://andygroff.com/jquery-debugger-debugging-plugin/ Nếu bạn xem ví dụ đối tượng, tôi sẽ thích rằng tiêu đề nói "clothingCompany Properties" thay vì chỉ đơn giản là "Object Properties" của nó không quan trọng khủng khiếp, nhưng sẽ được tốt đẹp. –

Trả lời

17

Bạn nói đúng, điều này là rất không thể theo bất kỳ cách nào lành mạnh, vì chỉ có giá trị được chuyển vào hàm.

+7

cách điên rồ là gì? –

+9

Lấy backtrace, lấy tệp và số dòng của lời gọi hàm, tải mã nguồn của tệp đó, tìm và phân tích cú pháp dòng đó, cố gắng tìm ra biến nào là tham số của bạn. Vì có thể có bất kỳ số lượng các cuộc gọi chức năng trên một dòng và các chức năng có thể được bí danh trong thời gian chạy, chưa kể đến sự phức tạp của công việc, tôi hy vọng sự điên rồ của điều này là hiển nhiên. – deceze

+0

Điều này bây giờ có thể xảy ra, hãy xem câu trả lời của tôi. – Offirmo

1

Đây là một kỹ thuật mà bạn có thể sử dụng để giữ tên và giá trị của biến.

// Set up a global variable called g 
var g = {}; 
// All other variables should be defined as properties of this global object 
g.foo = 'hello'; 
g.bar = 'world'; 

// Setup function 
function doStuff(str) { 
    if (str in g) { 
    var name = str; 
    var value = g[str]; 
    // Do stuff with the variable name and the variable value here 
    // For this example, simply print to console 
    console.log(name, value); 
    } else { 
    console.error('Oh snap! That variable does not exist!'); 
    } 
} 

// Call the function 
doStuff('foo'); // log: foo hello 
doStuff('bar'); // log: bar world 
doStuff('fakeVariable'); // error: Oh snap! That variable does not exist! 

Điều này có hiệu quả khi tạo từ điển ánh xạ tên biến cho giá trị của chúng. Điều này có thể sẽ không hoạt động cho mã hiện tại của bạn mà không cần tái cấu trúc mọi biến. Nhưng bằng cách sử dụng phong cách này, bạn có thể đạt được một giải pháp cho loại vấn đề này.

+0

Cảm ơn câu trả lời. Đây là một giải pháp tốt, mặc dù nó thực sự không giải quyết được vấn đề tôi gặp phải. Tôi đã viết một plugin gỡ lỗi sẽ tạo ra một cảnh báo phương thức với thông tin về các biến, bao gồm cả tên của nó. Nó sẽ cần phải chạy với bất kỳ javascript, do đó, lưu trữ tất cả các biến là thuộc tính đối tượng không phải là một giải pháp khả thi. Cảm ơn! –

+0

@AndyGroff thay thế biến 'g' cho biến' window' có thể giải quyết được sự cố của bạn. Nhưng cuối cùng bạn sẽ phải truy cập các biến bằng chuỗi thay vì số nhận dạng. – styfle

1

Vâng, tất cả các biến toàn cầu là các thuộc tính của đối tượng toàn cầu (cửa sổ hoặc cửa sổ này), phải không? Vì vậy, khi tôi muốn tìm hiểu tên của các biến của tôi, tôi đã thực hiện chức năng sau:

var getName = function(variable) { 
    for (var prop in window) { 
    if (variable === window[prop]) { 
     return prop; 
    } 
    } 
} 
var helloWorld = "Hello World!"; 
console.log(getName(helloWorld)); // "helloWorld" 

Đôi khi không hoạt động, ví dụ, nếu 2 chuỗi được tạo ra mà không cần điều hành mới và có giá trị như nhau.

+0

Điều này có phụ thuộc vào việc chạy trên trình duyệt không? Hay tôi hiểu lầm 'cửa sổ' là gì? – byxor

+1

Điều này sẽ không hoạt động nếu hai đối tượng có cùng giá trị. 'window.a = 1; window.b = 1;' Nó sẽ trả về tên của giá trị khớp đầu tiên. Ngoài ra, thực hành không tốt để xác định các biến trong phạm vi toàn cục. – styfle

0

Chuyển đổi một tập hợp các biến độc đáo vào một đối tượng JSON mà tôi đã viết chức năng này

function makeJSON(){ //Pass the variable names as string parameters [not by reference] 
ret={}; 
for(i=0; i<arguments.length; i++){ 
    eval("ret."+arguments[i]+"="+arguments[i]); 
} 
return ret; 
} 

Ví dụ:

a=b=c=3; 
console.log(makeJSON('a','b','c')); 

Có lẽ đây là lý do cho truy vấn này

+5

'ret [x] = x'; hoàn toàn không có lý do gì cho 'eval' ở đây! – deceze

1

Đây là bây giờ bằng cách nào đó có thể nhờ ES6:

function getVariableName(unknownVariableInAHash){ 
 
    return Object.keys(unknownVariableInAHash)[0] 
 
} 
 

 
const foo = 42 
 
const bar = 'baz' 
 
console.log(getVariableName({foo})) //returns string "foo" 
 
console.log(getVariableName({bar})) //returns string "bar"

duy nhất (nhỏ) nắm bắt được rằng bạn phải quấn biến chưa biết của bạn giữa {}, đó là không có gì to tát.

+1

'{foo}' chỉ là '{foo: 42}' ... vì vậy bạn chỉ gửi nó như một đối tượng. Xem 'Ký hiệu mới trong ECMAScript 2015': https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer –

+0

@CodyG. Tôi hoàn toàn nhận thức được điều đó. – Offirmo

+1

Sau đó, bạn không nên nói "bằng cách nào đó có thể nhờ es6", câu trả lời của bạn về cơ bản --- 'bạn có thể làm điều này bằng cách gửi giá trị như một đối tượng với khóa là tên biến' ... cũng dễ dàng thực hiện trong es5 với một polyfill của Object.keys, hoặc đơn giản bằng cách truyền một đối tượng có tên biến là một thuộc tính khác. –

Các vấn đề liên quan