cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Masalah dengan ini dalam js

JS novice, jika anda menghadapi masalah, sila tulis kod dahulu

var name = "John";

var myObject = function() {

    return {
        getName: function() {
            return this.name;
        }
    }
}();

alert(myObject.getName());

Hasil keluaran tidak ditentukan
Soalan saya ialah 1. return里面的getNamefunction是不是匿名函数 我现在理解的是匿名函数 那么这个this应该就是指向全局吧?就是window 那为啥不输出john 2.让我更困惑的是,我在调试时候一步步走,走到this.name的时候,this指向的是Object 而当输出完undefined的时候,我在监视那里的this变成了windowthis.name也变成了john, saya kurang faham, tolong bantu saya!

我想大声告诉你我想大声告诉你2730 hari yang lalu591

membalas semua(3)saya akan balas

  • typecho

    typecho2017-06-26 10:59:12

    Masalah ini perlu dilihat langkah demi langkah Pertama, myObject ialah objek yang terdapat padanya dipanggil getName, dan nilainya ialah fungsi tanpa nama alert(myObject.getName()); Objek ini yang memanggil kaedah ini tidak ditentukan pada masa ini.

    //
    var name = "John";
    
    var myObject = function() {
    
        return {
            getName: function() {
                return this.name;
            }
        }
    }();
    
    var f = myObject.getName;
    
    alert(f()); //John
    
    // 这样就返回的是John,因为这个时候的getName是在全局执行的,this指向的就是window。
    
    var name = "John";
    
    var myObject = function() {
    
        return {
            getName: () => {
                return this.name;
            }
        }
    }();
    
    alert(myObject.getName()); //John
    
    // 也可以通过es6修正this的指向
    
    

    Panjangkan lagi, tengok kod di bawah

        var object = {
            name: 'lucy',
            getName: function() {
                return function () {
                    return this.name
                }
            }
        }
     console.log(object.getName()()) //John
    

    Kaedah object.getName() mengembalikan fungsi tanpa nama Persekitaran pelaksanaan ialah skop global Ini menunjukkan skop pelaksanaan berdasarkan fungsi, jadi pada masa ini, window.name ialah John.
    Jika kita ingin mengembalikan lucy, kita perlu melakukannya dengan mencipta fungsi anak panah atau penutupan.

    var object = {
        name: 'lucy',
        getName: function() { console.log(this)
            return  () => {
                return this.name
            }
        }
    }
     console.log(object.getName()()) //lucy
     
     var object = {
        name: 'lucy',
        getName: function() {
            var that = this;
            return function () {
                return that.name
            }
        }
    }
     console.log(object.getName()()) //lucy
    

    Objek ini dalam badan fungsi anak panah ialah objek di mana ia ditakrifkan, bukan objek di mana ia digunakan.

    Bagi masalah penyahpepijatan perubahan titik ini, ia adalah kerana skop asal fungsi tanpa nama ialah tetingkap, tetapi apabila ia dilaksanakan, myObject memanggilnya, jadi ini menunjuk ke myObject pada masa itu.

    balas
    0
  • 为情所困

    为情所困2017-06-26 10:59:12

    var name = "John";
    
    var myObject = function() {
    
        return {
            getName: function() {
                return this.name;
            }, 
            name: 'eczn'
        }
    }();
    
    myObject.getName(); 
    // => 
    // "eczn"

    getNamethis 指的是 myObject,因为 getName 直接是 myObject 所调用的,所以这里的 this 指的是 ———— 调用函数的那个对象

    balas
    0
  • 为情所困

    为情所困2017-06-26 10:59:12

    myObject.getName()
    Biasanya sesiapa yang memanggil fungsi akan menunjuk kepada siapa fungsi ini tunjuk

    balas
    0
  • Batalbalas