Không lấy được giá trị từ con trỏ this
- Đầu tiên bạn phải xác định , bạn gọi hàm từ đâu.
- Và this trong JS thì hơi rắc rối
- Bạn có thể đọc thêm tại đây: https://javascript.info/object-methods#this-in-methods
- Và tham khảo thêm về bind tại đây : https://javascript.info/bind
=> Khi đọc cả 2 tài liệu trên đều có ví dụ ở cuối phần và cách giải quyết. Bạn sẽ hiểu rõ this trong JS hoat động như thế nào và khi nào sử dụng bind với this.
mình gọi hàm từ global scope, nên this nó sẽ trỏ đến cái globalThis, cái mình chưa hiểu tại sao globalThis nó ko bắt được cái biến myVar.
bạn thử thêm this.myVar.bind(this) thử xem
không được Bạn à, mình có test trên môi trường browser, thay cái globalThis bằng window thì this nó bắt được biến myVar
vậy giá trị this hiện tại của bạn là gì ?
bạn trỏ từ bên global qua function F như thế nào vậy
mình gọi hàm F() như ảnh kia đó Bạn
F.bind(myVar);
F();
xem sao nha bạn
Mình quên phải nói điều này với bạn , có thể bạn đã làm theo tut trên vanilla.js thì sẽ có kết quả như thế Hiện tại vì bạn chưa khai báo myVar nên không thể get được this.myVar
Mình không rõ nodejs thế nào. Nhưng đây là kết quả khi chạy trên https://repl.it/languages/nodejs với phiên bản node v12.16.1:
var var1 = 100;
var2 = 200;
let var3 = 300;
function f() {
var var1 = 99;
var var2 = 88;
var3 = 77;
console.log(var1);
console.log(var2);
console.log(var3);
console.log(this.var1);
console.log(this.var2);
console.log(this.var3);
console.log(this === globalThis);
}
console.log("f()");
f();
console.log("\nf.bind");
f.bind({var1:"123",var2:"456",var3:"eww"})();
Kết quả:
f()
99
88
77
100
200
undefined
true
f.bind
99
88
77
123
456
eww
false
môi trường NODE JS Repilt, t ko rõ có thể nó đã chỉnh sửa gì đó, nên mới tạo ra kết quả khác nhau, còn t code app và thực hành trên NODE JS local, nên t chỉ quan tâm node js ở máy tính thôi.
đơn giản vì biến myVar của bạn cũng chỉ là được khởi tạo như là 1 biến chứ không phải 1 property của obj
function test(){
var myVar = 'test';
console.log(myVar);
/*********************/
this.myVar = 'test this';
console.log(this.myVar);
/*********************/
myVar = 'test 1';
console.log(myVar);
console.log(this.myVar);
}
test(); // call function
var testObj = new test(); //init as object
console.log(testObj.myVar);
mọi người bảo mình cách học nhanh dc ko ạ?
mình muốn học React mà giờ mình cứ ì ạch ở JS này mình lo quá
Nãy giờ mọi người làm dài dòng quá, chỉ cần “bỏ” chữ var
ở dòng 1 hoặc thay dòng 1 thành:
global.myVar = 100
//Hoặc globalThis.myVar
là xong :V. Lí do là vì trong Node.js, script khi chạy sẽ nằm trong một cái anonymous function, được bọc trong một cái module, thành ra biến khai báo (theo cách thông thường) ở top-level scope thực chất là biến cục bộ trong cái script đó, không phải biến toàn cục. Code chạy trên REPL do không được bọc trong module nên code của @SuperFrankie8 và @SITUVN.gcd chạy không bị lỗi.
Trích từ tài liệu của Node.js:
In browsers, the top-level scope is the global scope. This means that within the browser
var something
will define a new global variable. In Node.js this is different. The top-level scope is not the global scope;var something
inside a Node.js module will be local to that module.
Trên Stack Overflow cũng có một câu hỏi tương tự:
Trong OOP, biến (variable) được gọi là property (thuộc tính), còn hàm (function) được gọi là phương thức (method). Trên trình duyệt, một biến toàn cục cũng được coi là thuộc tính của window
đấy.
let foo = "bar"
console.log(foo)
console.log(window.foo)
//Chạy trên trình duyệt
Trên Node.js thì có global
gần giống với window
trên trình duyệt.