Không lấy được giá trị từ con trỏ this


hi
mình ko hiểu vì sao nó báo undefine, mặc dù this đang trỏ đến global.
thanks

  1. Đầu tiên bạn phải xác định , bạn gọi hàm từ đâu.
  2. Và this trong JS thì hơi rắc rối
8 Likes

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

2 Likes

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ì ?

2 Likes


nó ghi gloabal, nhưng lạ nó không có biến myVar và hàm F()

bạn trỏ từ bên global qua function F như thế nào vậy

2 Likes

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

5 Likes


ko dc Bạn

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
5 Likes

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 :smiley:

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@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ự:

7 Likes

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.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?