Javascript JSLint "strict violation"

Javascript JSLint "strict violation"
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:104
0

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

Kopiuj
(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?

Kopiuj
function randomSKill(tab) {
			var liczba = Math.floor(Math.random() * tab.length);
			return tab[liczba];
}
edytowany 1x, ostatnio: loki121212
Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
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:

Kopiuj
var that = this;

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

L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:104
0

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

Kopiuj
(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();
	
}());

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Rzeszów
0
Kopiuj
(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();
 
}());

edytowany 1x, ostatnio: dzek69
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:104
0

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

Uncaught TypeError: Cannot read property 'skill' of undefined

Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
1

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

Kopiuj
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...

edytowany 2x, ostatnio: Maciej Cąderek
L1
To tylko tak dla przykładu napisałem, aby zrozumieć jak to działa. Dzięki za pomoc ;)
L1
A jeszcze jedno pytanko do tego kontekstu. Czy tutaj chodzi o tkz. domknięcia ? Czy jest to samo ?
Maciej Cąderek
Maciej Cąderek
Nie do końca, wykorzystales tam co prawda domkniecie, ale działanie this to osobną sprawa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.