Javascript JSLint "strict violation"

0

Witam! Otóż mam do Was małe pytanie o to kod:

(function () {
	'use strict';
	var gracz;
	
	function Player(name) {
		this.name = name;
		this.skill = ['speed', 'power', 'strength'];
	}
	Player.prototype.szhowSKill = function () {
		function randomSKill() {
			var liczba = Math.floor(Math.random() * this.skill.length);
			return this.skill[liczba];
		}		
		window.console.log(randomSKill(this.skill));
	};
	
	gracz = new Player('Maciek');
	gracz.szhowSKill();
}());	http://4programmers.net/Forum/Webmastering?mode=submit&forumId=3

Czy właściwość this.skill nie powinna być dostępna dla funkcji randomSkill() ? Co się na to składa, że nie jest. Zmodyfikowałem troszeczkę kod i działa on prawidłowo. Czy jest to poprawna przeróbka czy raczej w inny sposób rozwiązuje się ten problem?

function randomSKill(tab) {
			var liczba = Math.floor(Math.random() * tab.length);
			return tab[liczba];
}
1

this.skill nie zadziała wewnątrz randomSkill() ponieważ każda funkcja ma swój własny kontekst, gdzie this przybiera nową wartość. Jak chcesz użyć zewnętrznego this to najpierw przypisz go do innej zmiennej, zwyczajowo:

var that = this;

Wtedy możesz wołać that.skill i zadziała niezależnie od kontekstu.

0

Chodzi o taką modyfikację? Bo coś mi nie działa.

(function () {
	'use strict';
	var gracz;
	
	function Player(name) {
		var that;
		that = this;
		this.name = name;
		this.skill = ['speed', 'power', 'strength'];
	}
	Player.prototype.szhowSKill = function () {
		function randomSKill() {
			var liczba;
			liczba = Math.floor(Math.random() * that.skill.length);
			return that.skill[liczba];
		}
		window.console.log(randomSKill());
	};
	
	gracz = new Player('Maciek');
	gracz.szhowSKill();
	
}());

0
(function () {
    'use strict';
    var gracz;
    var that;
    that = this;
 
    function Player(name) {
        this.name = name;
        this.skill = ['speed', 'power', 'strength'];
    }
    Player.prototype.szhowSKill = function () {
        function randomSKill() {
            var liczba;
            liczba = Math.floor(Math.random() * that.skill.length);
            return that.skill[liczba];
        }
        window.console.log(randomSKill());
    };
 
    gracz = new Player('Maciek');
    gracz.szhowSKill();
 
}());
0

No niestety w konsoli nadal pojawia się błąd:

Uncaught TypeError: Cannot read property 'skill' of undefined

1

Nie no, this przypisujesz do zmiennej tam gdzie chcesz tego użyć, np:

function Example() {
    this.someProperty = 'something';
}
Example.prototype.someMethod = function () {
    var that = this;
    function someInnerFunction() {
        return that.someProperty;
    }
    console.log(someInnerFunction());
};

var example = new Example();
example.someMethod();

PS
Nie wiem po kiego Ci ta wewnętrzna funkcja w metodzie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1