Thắc mắc về object, property trong javascript nói chung và nodejs express nói riêng



  • Mình thấy đoạn code js này chạy bình thường trên trình duyệt (link fiddle):

    var runApp = {
        title: 'ABC',
        init: function() {
            this.run();
        },
        run: function() {
            alert(this.title);
        }
    };
    runApp.init();
    

    nhưng trong express, khi mình thử vọc vạch mô hình MCV thì có đoạn code này lại không chạy được:

    File register_controller.js:

    /* register_controller.js */
    var registerController = {
    	title: 'Mr.XXX',
    	index:  (req, res) => {	
    		this.other(req, res);		
    	},
    	other: (req, res)=>{		
    		res.render('register/register', {title: this.title});
    	}
    };
    
    module.exports = registerController;
    

    File app.js:

    ....//....
    var registerController = require('register_controller');
    app.use('/', registerController.index);
    ....//....
    

    Cụ thể, express báo là "this.other is not a function", với biến this.title thì undefined ??!!

    Không biết là trong cái nodejs kia nó thực thi javascript có "bình thường" như khi thực thi js trên trình duyệt mình vẫn làm trước đây không nhỉ ??

    Source code đầy đủ:
    0_1491833059419_bos_register.rar

    (đang cảm thấy bối rối về OOP của js)



  • arrow function khác với function thường nhé bạn.



  • cái này là do bạn đang gặp vấn đề với "this" trong js. arrow function không giống với function bình thường. arrow function là function expression và this trong arrow function không phải là dynamic giống như this trong function thường. this trong arrow function là this của lexical scope gần nó nhất .và trong trường hợp này của bạn nó đang là global object, không phải object mà bạn đang sử dụng. nếu bạn dùng strict mode thì this sẽ là undefined



  • Vấn đề không phải ở arrow function, mình đã thay bằng cách viết bình thường nhưng vẫn bị lỗi như vậy. Mình nghĩ là do 'this', như bạn trên nói, nó tham chiếu đến đối tượng gần nhất, hay xa nhất/ ngoài cùng ??!!
    Nhưng tại sao đoạn js ở phía trên lại thực thi trên trình duyệt (client) bình thường được ??



  • @phatht Vấn đề là ở Arrow Func. this của hai cách khai báo func sẽ khác nhau.

    var log = console.log;
    var self = this;
    
    // Arrow Func
    var test1 = ()=>{
    	if (this == self ) log("`this` in test1 equal self")
    }
    
    // not Arrow Func
    var test2 = function () {
    	var self_test2 = this 
    	if (this == self ) log("`this` in test2 equal self")
    	else {
    		if (this == self_test2) log("`this` in test2 equal self_test2")
    	}
    }
    
    test1()
    test2()
    

Log in to reply