のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,646,748人
昨日:no data人
今日:
最近の注目
人気の最安値情報

元スレ+ JavaScript の質問用スレッド vol.114 +

JavaScript覧 / PC版 /
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

801 = :

なんだそのめちゃくちゃな説明

802 = :

thisが関数を指すことなんてないよな

803 = :

関数とコンストラクタをゴッチャにしているJavaScriptが悪い

804 = :

コンストラクタも関数なんだから
その理屈はおかしい

807 = :

>>806
> 関数やインスタンスは、Functionオブジェクトで良いんだろ?
Functionオブジェクトが何を指しているのか今一不明だが、少なくとも [[Call] を持つオブジェクトじゃない

function A () {
console.log(A !== this); // true
}

console.log(typeof new A); // object

808 = :

>>805
http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval#Don.27t_use_eval.21
Strict Mode で使用できないし、基本的にそのような使い方は推奨されない

809 = :

> thisは、そのオブジェクトを指す
> 関数もオブジェクトなので、関数が異なると、thisも異なる

つまり、thisで参照するためには>>790の書き方ではダメってことですか?
たかだかthisで参照するだけなのに、制限があるってめんどいですねー

810 = :

this.say.bind(this)

811 = :

>>810

おかげ様で動きました。
bind(this)を書き忘れて、バグ作りそうですね

812 = :

>>811
だって普通そんな書き方しないしw
普通は無名関数を使う。

とりあえず、あんたが参考にしている
本とかあったら、その本は捨てるといいよ。

813 = :

>>812
> 普通は無名関数を使う。
その理屈はおかしい
登録されているListenerを解除することを考えたらハンドラ登録には名前付き関数を使う
jQueryは関数指定なしでもイベントハンドラ削除できる機構が用意されているが、それでも特定のハンドラのみを解除することを考えたら名前付き関数を使用するしかない
removeEventListener を使い慣れている人なら名前付き関数を使用するかもしれないし、その書き方が望ましいケースは確かにある
Function.prototype.bind は>>790のようなケースで利用されるものだと思う

そもそも、無名関数の多量生産は無駄にクロージャを作るという意味では良い設計とは言えない
jQueryは無名関数を多用する書き方が好まれる傾向にあるが、あの書き方ではデメリットもあることを覚えておいた方がいい

814 = :

>>812
普段は.NET + AS3で開発しているので、jsを触ることはないんでよくわからないんですが

jsではクラス使わないほうがいいんですかね?
会社で他の人が作っているERPみたら、クラス使っていなかったんです

816 = :

>>813
> 登録されているListenerを解除することを考えたらハンドラ登録には名前付き関数を使う

そんなの解除するときだけ考えればいいことでしょ?

通常イベントハンドラを削除したい時は要素を削除する時で、
jQueryで要素を削除すれば、それに関連したイベントハンドも一緒に解除されて
メモリリークも起きないのだからそこは気にする必要がない。

要素は存在するのにイベントだけを削除することはほとんどない。
一時的に無効にしたい場合でも、classで状態を変化させて、セレクタで切り分ける

817 = :

>>808
evalを使わないと出来ないのですね
ありがとうございました

818 = :

>>817
今思い至ったのだが、プロパティ名なら変数を利用できる
変数名として使いたいのなら無理だが、改修できるようならオブジェクト化を検討してもいいかもしれない

819 = 815 :

>>816
> そんなの解除するときだけ考えればいいことでしょ?
全体コードが不明なのに>>812の時点で解除しないとなぜ言い切れる?
この時点で「普通は無名関数を使う」とか「質問者が参考にしている本を捨てるといい」とまで言い切れる理由があるならちゃんと説明して欲しい

> メモリリークも起きないのだからそこは気にする必要がない。
メモリリークの話はしてない
クロージャの多量生産は束縛される変数の数だけメモリを消費するが、それは仕様であってメモリリークではない

820 = :

>>819
> 全体コードが不明なのに>>812の時点で解除しないとなぜ言い切れる?

基本的な考えとして、

今必要ないなら作らない。
必要になった時に作る

という考えにした方がいいよ。

忠告ね。

821 = :

YAGNIって考え方だね。

プログラムってのは将来どう成長するか不明なものだから、
不明だから解除する場合のことまで考えておくという発想だと
すべて解除可能にしなきゃいけない。

その考えていけば拡張可能にしなきゃいけないとか
言い出しそうだし、prototype使う必要がない場面でも
不明だから、とりあえず使うとかいうことになりかねない。

拡張可能にすることで、コードが膨れないのならいいけど、
この場合は明らかに現在必要がないコードを書くことになってる。

こうやって必要のない無駄なコードをどんどん書くことになる。
これはYAGNIの原則に反する。

822 = 815 :

>>820
その返答では「無名関数を使用しなければならない必然性」を説明できてないと思うが…
「無名関数を使用する方法もあるよ」ならここまで引っ張らなかった

823 = :

無名関数を利用する事と>>790の問題がどう関係しているのかわからない
「new Index() な書き方は避けて全部無名関数を使用すればいいよ」って主張してるの?

824 = :

>>823
主張はレスの内容を見ようね。

> bind(this)を書き忘れて、バグ作りそうですね
>
>
> 812 名前:Name_Not_Found[sage] 投稿日:2014/04/27(日) 14:03:58.02 ID:???
> >>811
> だって普通そんな書き方しないしw
> 普通は無名関数を使う。

826 = :

>>824
無名関数を使用する事でどうやってthis値を束縛するの?
具体的なコードを示して欲しい

無名関数内で Function.prototype.call を使う解決方法もあるけど、Function.prototype.call が解決法だし、Function.prototype.bind を否定する要素がない

827 = :

>>825
無名関数に名前付けた場合それは無名関数なのか

828 = :

名前付けてなくね

829 = :

>>827
変数に格納しただけで無名関数
そもそも、無名関数を名前付き関数に変更する方法はないと思うんだが(あるなら教えて欲しい)
非標準の Function.prototype.name も読み取り専用だし

830 = :

var a = {
b: 1
};
var c = a.b;
のとき
delete(c);
としても、a.bは削除されません
delete(a.b);
とすると削除されます
delete関数の引数が普通の関数と異なり「必ず参照渡し」になっているということだと思いますが
プログラマーが明示的にこういう関数を作ることは出来ないのでしょうか?

831 = :

jsのthisの仕様どうにかして欲しいですね
他の言語を使ってきた人が、間違えてしまう

jsは柔軟性がある言語だと主張している人がいますが、
書き方が自由なだけであって柔軟性があるとはまた違う気がする

柔軟性 == それなりの規模のアプリケーションを作れる

832 = :

>>827
いちおう名前を付けることはできるけどな

var f1 = function f2(){
alert(f1.name);
}

f1(); // "f2"
f2(); // エラー(名前を付けたからと言って呼び出せるわけではない)

833 = :

>>830
delete演算子は関数じゃない
delete演算子はプロパティ削除であって変数を削除できない

834 = :

関数名を後で変更できたら怖い

var hoge = function foo () { console.log(foo.name); }
hoge.name = 'piyo'; // 書き換え可能だったとする(※実際は書き換え不可)
hoge(); // ReferenceError: foo is not defined

835 = :

>>832
名前付き関数の事例なら>>834のようにすべき

836 = :

>>833
関数じゃないなら納得です
ありがとうございました

837 = :

>>832
> f2(); // エラー(名前を付けたからと言って呼び出せるわけではない)
>>835で指摘されてるけど、関数内部からは呼び出せるよ
不変の名前として参照できるので便利

838 = :

>>837
知らなかった、ありがとう、早速使ってみる

839 = :

>>832
> f2(); // エラー(名前を付けたからと言って呼び出せるわけではない)
IE8 には f2 で呼び出せるバグがあったんだよね
当時は予期せぬ不具合を生み出しそうで使うのを敬遠してた
http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx

840 = :

今日一日thisを調べてみたのですが、間違えていないか教えてください。

this -> 呼び出し元のオブジェクトがセットされる。javaのthisとは違う

クラスっぽいものを作って、それのメンバ関数をイベントリスナーに登録する際は、
bind/applyとかを使ってthisにセットされるインスタンスを指定してあげなければならない。

あってますか?

841 = :

あってるよ

842 = :

メソッドたる関数オブジェクトが、親オブジェクトと密接に結び付いてないから
thisが文脈によってコロコロ変わるんだよな

843 = :

>>841-842
ありがとうございました。
明日は仕事だし、みんなおやすみー

844 = :

>>816
要するに、行き当たりばったりサイコーって事ですね

845 = :

aタグが混ざっているhtmlから
aタグを普通の文字列に変換するにはどうしたらいいですか?
jqueryありでお願いします

846 = :

>>840
bind使わないんだったら

function Index() {
$('[id="htmlForm:button1"]').click((function (that) {
return function () {
that.say();
};
})(this));
this.count = "aa";
}

こんな感じ
まあ面倒だわな

847 = :

>>846
それなら call を使う方がまだシンプルな気がする
まあ、bind が一番スマートなのは間違いないけどね

848 = :

bindの置き換えで考えると >>846になるけど、
単純に

function Index() {
var that = this;
$('[id="htmlForm:button1"]').click(function () {
that.say();
});
this.count = "aa";
}

でいいか

>>847
callだとどうなるの?

850 = :

>>848
ごめん、良く考えたら call では無理だった


←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について